From cd690c1faa824e4fd9db024ac890d72a1ad20d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Wed, 21 Jan 2026 04:09:54 +0900 Subject: [PATCH] =?UTF-8?q?SVN=E3=81=8B=E3=82=89=E3=81=AE=E3=83=9F?= =?UTF-8?q?=E3=83=A9=E3=83=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 ++ LICENSE.txt | 14 +++++++++ Makefile | 36 ++++++++++++++++++++++ README.md | 11 +++++++ go.mod | 3 ++ main.c | 71 +++++++++++++++++++++++++++++++++++++++++++ main.go | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++ pwnd.rc | 10 ++++++ 8 files changed, 233 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 LICENSE.txt create mode 100644 Makefile create mode 100644 README.md create mode 100644 go.mod create mode 100644 main.c create mode 100644 main.go create mode 100644 pwnd.rc diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0a0d870 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,2 @@ +# 1.0.0 +* 最初リリース diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..c4d9131 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright © 2004-2011 by Internet Systems Consortium, Inc. ("ISC") +Copyright © 2018-2024 by 076.moe + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD +TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..397cc03 --- /dev/null +++ b/Makefile @@ -0,0 +1,36 @@ +NAME != cat main.go | grep "var sofname" | awk '{print $$4}' | sed "s/\"//g" +VERSION != cat main.go | grep "var version" | awk '{print $$4}' | sed "s/\"//g" +PREFIX = /usr/local + +CC = CGO_ENABLED=0 go build +RELEASE = -ldflags="-s -w" -buildvcs=false + +all: + ${CC} ${RELEASE} -o ${NAME} + +release: + mkdir -p release/bin/${VERSION}/openbsd/amd64 + env GOOS=openbsd GOARCH=amd64 ${CC} ${RELEASE} -o\ + release/bin/${VERSION}/openbsd/amd64/${NAME} + +clean: + rm -f ${NAME} + +dist: + mkdir -p ${NAME}-${VERSION} release/src + cp -R LICENSE.txt Makefile README.md CHANGELOG.md\ + main.go ${NAME}.rc src go.mod go.sum ${NAME}-${VERSION} + tar zcfv release/src/${NAME}-${VERSION}.tar.gz ${NAME}-${VERSION} + rm -rf ${NAME}-${VERSION} + +install: + mkdir -p ${DESTDIR}${PREFIX}/bin ${DESTDIR}/etc/rc.d + cp -f ${NAME} ${DESTDIR}${PREFIX}/bin + chmod 755 ${DESTDIR}${PREFIX}/bin/${NAME} + cp -f ${NAME}.rc ${DESTDIR}/etc/rc.d/${NAME} + chmod +x ${DESTDIR}/etc/rc.d/${NAME} + +uninstall: + rm -f ${DESTDIR}${PREFIX}/bin/${NAME} + +.PHONY: all release clean dist install uninstall diff --git a/README.md b/README.md new file mode 100644 index 0000000..029c82c --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# pwnd +パスワードが漏洩したかどうかを確認するサーバーデーモン\ +**OpenBSDのみ** + +## インストールする方法 +```sh +make +doas make install +doas rcctl enable pwnd +doas rcctl start pwnd +``` diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..a846a7f --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module pwned + +go 1.22.1 diff --git a/main.c b/main.c new file mode 100644 index 0000000..2beb84a --- /dev/null +++ b/main.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main() { + int sock; + struct sockaddr_in srv; + struct addrinfo hints, *addr; + + char pas[256]; + char res[10]; + int reslen = 0; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; // IPv4 + hints.ai_socktype = SOCK_STREAM; // TCP + + int status = getaddrinfo("076.moe", NULL, &hints, &addr); + if (status != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); + exit(1); + } + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) { + perror("ソケットを作成に失敗"); + exit(1); + } + + srv.sin_addr = ((struct sockaddr_in *)(addr->ai_addr))->sin_addr; + srv.sin_family = AF_INET; + srv.sin_port = htons(9951); + + freeaddrinfo(addr); + + if (connect(sock, (struct sockaddr *)&srv, sizeof(srv)) < 0) { + perror("接続に失敗"); + close(sock); + exit(1); + } + + printf("パスワード: "); + fgets(pas, sizeof(pas), stdin); + pas[strcspn(pas, "\n")] = 0; + + if (send(sock, pas, strlen(pas), 0) < 0) { + perror("送信に失敗"); + close(sock); + exit(1); + } + + reslen = recv(sock, res, sizeof(res) -1, 0); + if (reslen < 0) { + perror("受取に失敗"); + close(sock); + exit(1); + } + + res[reslen] = '\0'; + + printf("Pwned: %s\n", res); + + close(sock); + return 0; +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..f589dd3 --- /dev/null +++ b/main.go @@ -0,0 +1,86 @@ +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) + } +} diff --git a/pwnd.rc b/pwnd.rc new file mode 100644 index 0000000..5be6f12 --- /dev/null +++ b/pwnd.rc @@ -0,0 +1,10 @@ +#!/bin/ksh + +daemon="/usr/local/bin/pwnd" + +. /etc/rc.d/rc.subr + +rc_bg=YES +rc_reload=NO + +rc_cmd $1