记一次对柬埔寨国家就业局 CPES 平台的入侵复盘(2026)
原创
助力行业的
助力行业的
李白你好
2026年10月27日 07:30
青海
去阅读
编者按:本文为基于黑客论坛黑客发帖记录第一人称叙述。以第一人称的心理与对白为重构,技术事实构成了对应证据。文中不包含任何可复现的攻击方法,以下内容为黑客独白。
一、我为什么挑衅他们
我不看国旗,也不看新闻。我看三样东西:数据新不新、门老不老、发现了会不会有人管。
柬埔寨国家就业局(NEA)三条都占。
他们的CPES平台挂在nea.gov.kh上,做的岗位发布、简历登记、简历库、全国就业中心的事情。技术栈是十几年前的模板:Spring 4、韩国的电子政务框架、两个Tomcat实例(cpesEx对外、cpesIn对内)、一个MariaDB。这样的系统我见过几次——业务跑到现在顺顺,代码一直没人碰,这些停在一个大家都觉得“现在没出事”的这一年。
更让我满意的是数据。我随手翻了几页岗位,编号是这样的:
ff6a34c22ed611f0a07df40270d29e0d
标准的UUIDv1,时间型主键,后面三个字段像指纹一样固定。我在心里记下了:这台库不换实例,编号就不会变。后来我导出的每一个seq,后缀都是70d29e0d或4ba462f8。
一个能被证明“来自同一台机器”的数据包,在论坛上比一堆漂亮的截图值钱。
二、门
门不是密码。密码太补了,输错三次会留日志,撞库会触发同样。
门是上传。
那套系统里有一个文件上传组件,韩国做的,很多政务站都用它。它处理文件的方式很旧:扩展名、路径、临时目录,每个环都相信客户端说的一切。我在/home/upload/下面看到了我想看到的东西——这个目录在他们的机器上一直存在,权限宽得像一段客套话。
进去之后我没有立即提权。我花了很长时间,只是看看。
看/opt/tomcat/logs/catalina.out里那些“不允许文件扩展名”的报错,看线程里挂着的一串Raonwiz.Dext5.Process.Html5.Upload.Run——其实他们也看到了同样的东西,只是比我晚。
我在他们
bash_history那里读到自己留下的痕迹被别人一行一行翻出来的感觉。很奇怪。
三、留住门
那天获得root后,我做了一件不体面的事:我没有先拿数据。
数据是货,门是命。货卖一次了,门可以卖很多次。
于是我在三个地方各放了一把钥匙。
第一个放在/etc/crontab和/var/spool/cron/root里,每五分钟一次。它看起来像一条普通的定时任务,前半段是一串base64,解码后只有六个词的请求——把shell交出去,原来是一个新加坡的机器。
这把/root/.bashrc是我最满意的。我写了一个包装函数,把crontab这个命令包上升了,函数体里塞满同一个标记:#linpercrontab。它做了两件事——如果后门行被我外面的人删掉了,下次有人执行的crontab时候它就会行写回去;如果没被删,什么也不做,安静得像没来过。文件的最后一行更直接替换:任何人以root登录,就可以连我一次。
这不是后门,这是习惯。人们不会每天检查自己的.bashrc。
第三把是@reboot。我放了一个二进制在/usr/local/lib/.rs,配一个私钥在/usr/local/lib/.rk,启动启动后等四十五秒,然后连出去。它对外派自己叫kworker/0:1——那是Linux内核线程的名字,top里面永远有一批,运维看到了也只能过去划。我把日志关到DISABLED,把指纹写死在启动参数里,这样就不会连错服务器了。
我承认这套东西有点懂了。但它很有效。
四、搬空
他们的数据库叫cpes。
mysql_history里边还留着我当时的沟通:show databases、、、、、。use cpes``show tables``select count(*) from resume``select * from CPES_RESUME limit 10
我先数了一遍:两万四千多份完整档案,两万五千多份简历索引,八千多个公司,六百多个在招岗位,三十八个学生,还有一张日记表——里面存着解密后的手机号和邮箱,一百十一张。
然后我把它们分成七个文件,一个一个JSON,慢慢地倒。没有mysqldump,没有压缩流出来,就像搬家时一件往纸箱里塞。倒了很久,最后是187MB。
压缩的时候我浏览了一下时间:十月二十五日,晚上十一点二十三。二十六个文件,从二十三点二十三写到第二天零点二十四。压缩后就只有2.59MB——内容就是这样,看着很多,其实很轻。
同一天,我在暗网论坛发了帖,标题写了严格矩:[DATABASE] [KH] National Employment Agency of Cambodia - nea.gov.kh。三个网盘链接,一个样本截图,一句“有些信息是故意编辑的”。签名挂在底下:叫我火花,傻瓜!
我的账号是八月注册的。到那天,六十九个帖子,四十三个主题。我不是第一个,也不会是最后一个。
五、两万四千人
有些东西是我在导完之后才看到的。不是有害,是全部。
两万四千二百五十四份档案里,每一个名字都是真的。高棉文,两三个字,有的中间带一个零宽空格,像打字的人按错了键。每一个现居地址也真的——“金边市…”“干拉省…”“磅湛省…”。年龄、性别、想做工作、希望多少薪水、在哪一年哪一月进哪一年家厂、在哪所学校读到哪一年,全部都在。
邮箱我打了星号,电话我也打了星号。不是我仁慈,是他们系统本来就这么显示的——前端把联系方式藏了起来,只留下姓名和地址。我拿到的就是这份“藏了一半”的东西。
可我还是知道了很多。
他们的年龄集中在二十一、二十二、二十三岁。二十二岁那一年有三千七百六十六人。女性比男性多,一万千六百三十七对一万零七百零五。三成多的人的期望工资一栏写着0——不是不要钱,是那四栏可以不填。
两千六百二十五个人希望一个月能得到两百到两百五十美元。
金边就业中心名下有七千二百四十九份简历。菩萨四千三百六十三,暹粒三千四百三十一,班迭棉吉二千九百二十八,柏威夏二千六百六十二,上丁一千七百三十七,磅湛零一十六。
我在那些地址里读到过很具体的句子——有人把邮箱写进了地址栏,有人把手机号写在了工作经历里。总共七个邮箱、十五个手机号,都是求职者自己忘记删掉的。那一刻我才意识到,我手中的表格不是“数据”,而是两四千个正在找工作的人。
六、他们也看见了
翻bash_history的时候,我看到了另一篇文档。
六百九十九行。有人在他们的服务器上敲过这些:
ps auxww | grep -E '[n]c -e|[n]cat|[s]ocat|159\\.223\\.69\\.30'
ss -antp | grep '159.223.69.30'
ls -lah /home/upload/
他在找我的后门。他找到了。
他还跑过top,跑过jcmd 14344 Thread.print,把线程快照存储成两个文件,里面Raonwiz.Dext5.Process.Html5.Upload.Run出现了多少次,翻catalina.out里的上传异常,重新启动Tomcat。
他做事很认真。认真到我有点佩服。
然后他停下来了。
历史记录里出现了一行// This is the omitted part——就像一篇文章被剪掉了一段。也许是他剪的,也许是他来不及写的。之后就是top、、su的systemctl status循环,再没有别的了。
而我的三把钥匙,已经很少了。
root的口令预定是2020年4月设定的,一万八千三百五十五天,五年半没动过。tomcat-users.xml还是Apache出厂时的那份注释模板,连一个用户都没有加过。known_hosts里除了内网十二台机器,还留着我的地址——他们自己的服务器,曾经主动连过我。
我从来不觉得自己厉害。我只是来得比他们快一点。
七、我撒的谎
帖子里我写了“Tomcat用户凭据”和“MySQL配置”。
上面是假的。他们那两个tomcat-users.xml打开就是一堆<!-- -->,连示例用户都被注释掉了。晚上也不是全真:my.cnf里只有路径、socket和日志目录,一个账号一个口令都没有。
shadow里四十六个账户,四十三个是*,真正能拿去跑的哈希只有三个:root、一个集群软件留下的默认账户、还有一个跑应用的cpesuser。我在帖子里把这三个说成了“密码哈希”,听起来好像能开很多门。
我为什么撒谎?因为我在卖的不是数据。
数据是公开的,谁下呢。我在帖子里想说真正的还有另一句话:“我还进得去,而且我知道怎么进去。”所以我要写“主机详细信息、SSH访问、短信密码、LFI root访问”,要写“MySQL在手,只是白名单挡着”。这些话里有真的(我确实有解密、有拓扑、有后门),也有半真的(数据库我只在白名单外面看过)。
还有一件事我还没说破:那两万四千份掩码。
前端打星号,不代表星号后面是空的。我手里有一百十一条解密过的记录——高棉文姓名、英文姓名、手机号、855+手机号@cpes.com这样的账号——它们证明那层“打码”不是加密,只是显示。谁能解开一条,理论上可以解开两万四千条。
我没有全解。不是不能,是没必要。留着,比用掉更值钱。
八、我留下的东西,还有那扇还开着的门
如果有一天他们真的把东西翻个底朝天,他们会找到这些:
- 一台新加坡的机器,等在每五分钟里:
159.223.69.30:8080 - 另一台新加坡的机器,等待开机后的第五十五秒:
104.234.174.181:443,指纹49d421193d34ac8e25bfdb89f7614f0bf8493d837f518121bc42aeaf778e9a78 /usr/local/lib/.rs、/usr/local/lib/.rk- 一个叫
kworker/0:1的进程,和真正的内核线程只差一个路径 - 一个会在有人执行
crontab自己爬回来的函数时,标记是#linpercrontab - 一份没有密码的DSA私钥,挂在
root@cpeswas1名下 - 十二台内网主机的位置:
cpeswas1、cpeswas2、172.10.20.121/122/130/131/132/151/153/154/155、172.10.10.101
我知道他们会先做什么。改密码,换钥匙,重装系统,发公告,请人来查。
这些都对,但还不够。
如果只能给那天在服务器上敲击ps auxww | grep的人留下一句话,我想的是:
别先改密码。
先看/root/.bashrc的最后二十行。先看/var/spool/cron/root的第二行。先确认那个kworker/0:1的readlink指向哪里。因为密码改了,门还在;系统重装了,如果备份回来里带着.bashrc,门就跟着了。
我在帖子里说“2026年10月25日被@DaOnlySpark破坏”。
这句话里最刺眼的不是日期,而是被破坏——它不是过去式。
本文为威胁情报记录作品,所涉个人数据均已打码,技术细节仅用于防御参考。
网络安全情报攻防站
www.libaisec.com
综合性的技术交流与资源共享社区
重点关注红蓝对抗、攻防渗透、威胁情报、安全资讯
👇点击阅读原文,访问网络安全情报攻防站
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论