simple compile script so i dont have to type it out each time
This commit is contained in:
parent
70d0a9948e
commit
bc02105dfa
2 changed files with 100 additions and 2 deletions
3
compile.sh
Normal file
3
compile.sh
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/sh
|
||||||
|
go build -o portscraper main.go
|
||||||
|
GOOS=windows GOARCH=amd64 go build -o portscraper.exe main.go
|
99
main.go
99
main.go
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
@ -20,7 +21,7 @@ type OpenPort struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
const batchSize = 255
|
const batchSize = 255
|
||||||
|
var minecraftServers []string
|
||||||
var (
|
var (
|
||||||
printMutex sync.Mutex
|
printMutex sync.Mutex
|
||||||
fileLock sync.Mutex
|
fileLock sync.Mutex
|
||||||
|
@ -103,6 +104,86 @@ func identifyServiceAndOS(ip string, port int) string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func queryMinecraftServer(ip string, port int) string {
|
||||||
|
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ip, port), 3*time.Second)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
writeVarInt := func(val int) []byte {
|
||||||
|
var out []byte
|
||||||
|
for {
|
||||||
|
temp := byte(val & 0x7F)
|
||||||
|
val >>= 7
|
||||||
|
if val != 0 {
|
||||||
|
temp |= 0x80
|
||||||
|
}
|
||||||
|
out = append(out, temp)
|
||||||
|
if val == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
protocolVersion := 754
|
||||||
|
serverAddr := ip
|
||||||
|
state := 1
|
||||||
|
// so confusing for me i actually had to comment stuff
|
||||||
|
var payload []byte
|
||||||
|
payload = append(payload, 0x00) // fackin packet ID for handshake
|
||||||
|
payload = append(payload, writeVarInt(protocolVersion)...) // protocol version
|
||||||
|
payload = append(payload, writeVarInt(len(serverAddr))...) // address length
|
||||||
|
payload = append(payload, []byte(serverAddr)...) // address
|
||||||
|
payload = append(payload, byte(port>>8), byte(port&0xFF)) // port
|
||||||
|
payload = append(payload, byte(state)) // next state: status
|
||||||
|
|
||||||
|
packet := append(writeVarInt(len(payload)), payload...) // full packet = length + payload
|
||||||
|
conn.Write(packet) // send handshake
|
||||||
|
conn.Write([]byte{0x01, 0x00}) // send status request
|
||||||
|
|
||||||
|
conn.SetReadDeadline(time.Now().Add(3 * time.Second))
|
||||||
|
buf := make([]byte, 4096)
|
||||||
|
n, err := conn.Read(buf)
|
||||||
|
if err != nil || n == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
start := bytes.IndexByte(buf, '{')
|
||||||
|
if start == -1 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
jsonData := string(buf[start:n])
|
||||||
|
|
||||||
|
var status struct {
|
||||||
|
Version struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
} `json:"version"`
|
||||||
|
Description interface{} `json:"description"`
|
||||||
|
Players struct {
|
||||||
|
Online int `json:"online"`
|
||||||
|
Max int `json:"max"`
|
||||||
|
} `json:"players"`
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := json.Unmarshal([]byte(jsonData), &status); err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
desc := ""
|
||||||
|
switch v := status.Description.(type) {
|
||||||
|
case string:
|
||||||
|
desc = v
|
||||||
|
case map[string]interface{}:
|
||||||
|
if text, ok := v["text"].(string); ok {
|
||||||
|
desc = text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%s | %d/%d players | %s", status.Version.Name, status.Players.Online, status.Players.Max, desc)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func scanPort(ip string, port int, wg *sync.WaitGroup) {
|
func scanPort(ip string, port int, wg *sync.WaitGroup) {
|
||||||
printStatusLine(ip, fmt.Sprintf("scanning port %d...", port))
|
printStatusLine(ip, fmt.Sprintf("scanning port %d...", port))
|
||||||
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ip, port), 500*time.Millisecond)
|
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ip, port), 500*time.Millisecond)
|
||||||
|
@ -114,7 +195,9 @@ func scanPort(ip string, port int, wg *sync.WaitGroup) {
|
||||||
hostname = strings.TrimSuffix(host[0], ".")
|
hostname = strings.TrimSuffix(host[0], ".")
|
||||||
}
|
}
|
||||||
fingerprint := identifyServiceAndOS(ip, port)
|
fingerprint := identifyServiceAndOS(ip, port)
|
||||||
|
if port == 25565 {
|
||||||
|
minecraftServers = append(minecraftServers, ip)
|
||||||
|
}
|
||||||
openPortsLock.Lock()
|
openPortsLock.Lock()
|
||||||
openPorts = append(openPorts, OpenPort{ip, port, hostname, fingerprint})
|
openPorts = append(openPorts, OpenPort{ip, port, hostname, fingerprint})
|
||||||
line := fmt.Sprintf(" - %s : port %d open - hostname: %s", ip, port, hostname)
|
line := fmt.Sprintf(" - %s : port %d open - hostname: %s", ip, port, hostname)
|
||||||
|
@ -269,4 +352,16 @@ func main() {
|
||||||
summaryFile.WriteString("[+] scan summary: open ports found with fingerprints\n")
|
summaryFile.WriteString("[+] scan summary: open ports found with fingerprints\n")
|
||||||
}
|
}
|
||||||
fmt.Println("[+] scan summary written to summary.txt")
|
fmt.Println("[+] scan summary written to summary.txt")
|
||||||
|
if len(minecraftServers) > 0 {
|
||||||
|
safePrintln("[*] querying Minecraft servers on port 25565...")
|
||||||
|
for _, ip := range minecraftServers {
|
||||||
|
status := queryMinecraftServer(ip, 25565)
|
||||||
|
if status != "" {
|
||||||
|
safePrintln("[MC] Server at", ip, "responded.")
|
||||||
|
summaryFile.WriteString("[MC] " + ip + ":25565 " + status + "\n")
|
||||||
|
} else {
|
||||||
|
summaryFile.WriteString("[MC] " + ip + ":25565 no response or malformed\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue