pwnd/main.go

87 行
1.7 KiB
Go
Raw 通常表示 履歴

2024-09-29 15:31:05 +09:00
package main
import (
"bufio"
"crypto/sha1"
"encoding/hex"
"log"
"net"
"os"
"strings"
)
var sofname = "pwnd"
var version = "0.0.0"
var serverhost = "0.0.0.0"
var serverport = "9951"
var pwnroot = "/mnt/pwned/hashes/"
func checkPwnedHash(hash string) string {
prefix := strings.ToUpper(hash[:4])
filePath := pwnroot + prefix + ".txt"
file, err := os.Open(filePath)
if err != nil {
log.Printf("ファイル「%s」を開けられません: %v\n", filePath, err)
return "-1"
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
parts := strings.Split(line, ":")
if len(parts) != 2 {
continue
}
if parts[0] == strings.ToUpper(hash) {
return parts[1]
}
}
if err := scanner.Err(); err != nil {
log.Printf("ファイル「%s]を読み込まれません: %v\n", filePath, err)
}
return "0"
}
func handleConnection(conn net.Conn) {
defer conn.Close()
buf := make([]byte, 256)
n, err := conn.Read(buf)
if err != nil {
log.Println("クライアントからのエラー:", err)
return
}
password := strings.TrimSpace(string(buf[:n]))
sha1Hash := sha1.New()
sha1Hash.Write([]byte(password))
hash := hex.EncodeToString(sha1Hash.Sum(nil))
res := checkPwnedHash(hash)
conn.Write([]byte(res))
}
func main() {
listener, err := net.Listen("tcp", serverhost + ":" + serverport)
if err != nil {
log.Fatal(err)
}
defer listener.Close()
log.Println("サーバーは " + serverhost + ":" + serverport + " で実行中・・・")
for {
conn, err := listener.Accept()
if err != nil {
log.Println("接続エラー:", err)
continue
}
go handleConnection(conn)
}
}