ssh弱いパスワードスキャン(golangバージョン)

2083 ワード

0x00
浸透を试みるうちに、自分もコードを书き、他人の道具ばかり使ってはいけないという考えが芽生えた.そこで今回私が突然ssh弱パスワードスキャンをしようとしたとき、ためらうことなくそのまま手に入れました.
0x01
このようなものをスキャンすると、単一スレッドはあなたのコンピュータの性能に対する侮辱です.私はC/C++という2つのマルチスレッドがあまり安易に書かれていない言語を上手に排除し、pythonを直接選択しました.冒頭はまだスムーズだと書いていましたが、本当に動いたとき、私は深刻な問題を発見しました.なぜCtrl-Cは役に立たないのですか.調べてみると、balabalaが山積みになっていて、とにかくpythonサブスレッドが走っている間にメインスレッドがブロックされていたのでsigINTもブロックされ、信号が届かないスレッドはためらうことなく走り続けた.
解決策がないわけではないが、この設定は本当に馬鹿で反人間的だと思う.私の考えは源生が合併を支持するC系言語に転向した:go
0x10
goにあまり詳しくないので、私はこのわずか数十行のコードを完成する過程でかなりのトラブルに遭遇したと言わざるを得ません.
まずgoのsshパッケージの使用についてです:godocの中でなぜかすべてのコードにパッケージ名が付いていないので、私はしばらく頭が悪くてもここに問題があることに気づかなかったので、意外にもパッケージ名を持っていないでこのように書きました.そこでコンパイル時にsshパケットが使用されていないことを示す一方でDialなどのいくつかの識別子が定義されていないことを示す......しかしこれは一時的な損失としか言いようがない.
2つ目のエラーは見苦しいですが、pythonの同時書き込みではサブスレッドはメインスレッドの終了に伴って終了しません.goここに着いたらそうではありません.私はこの問題を思わなかったわけではありませんが、解決策は愚かです......私は無限forサイクルを使ってブロックの効果を達成しようとしました.事実はそれが不可能であることを証明している.
三つ目は、間違いではない.pythonを書くときのスレッド間同期はロックで完了し、この問題でgoの表現は本当に優雅でハイエンドです.channelは同時にコヒーレント間通信とブロックの機能を果たし,簡単なコードでこの機能を完成させた.
その4、私はどのようにすべてのgoroutineが走った後に終了のヒントを出力するかに困っています.最初はReadPassword関数が戻ってきたときに出力しましたが、戻ってきたときは実際にgoroutineが走っていなかったので、余分に出力してしまい、とても見苦しいです.その後syncパッケージの同期原語を見つけて、この問題を解決しました.
package main
import "code.google.com/p/go.crypto/ssh"
import "fmt"
import "bufio"
import "os"
import "strings"
import "sync"


var channal = make(chan string)
var w   sync.WaitGroup

func readPassword(pf *bufio.Reader){
    for{
        password,err := pf.ReadString('
') if err!=nil { close(channal) //print("scan finished,result not found
") return } password = strings.TrimRight(password,"
") channal

goへの熟知度は高くないので、コードには最適化できるところがたくさんあるに違いない.しかし、基本的な弱いパスワードをスキャンする機能はすでに完了しています.
PS1.弱いパスワードの辞書を使う必要があります.私はjohn the ripperに持っている辞書を使っています.
PS2.sshパッケージは自分でインストールする必要がありますgo get+パッケージ名
PS3.文字列の「033[33 m」は、エラー結果の黄色出力、正しい結果の緑色出力を達成するために端末に配色するためのものです.