Kye0m's Security

[AndroGoat] Network Intercepting 본문

앱 모의해킹/AndroGoat

[AndroGoat] Network Intercepting

Kye0m 2022. 9. 16. 19:01

Androgoat - Network Intercepting

SSL 피닝문제이다. Nox를 버프슈트와 연결한 후, http와 https버튼을 누르면 각각의 패킷이 성공적으로 잡히는것을 볼 수 있다. 하지만 CERTIFICATE PINNING 버튼을 누르면 그렇지 않다.

 

문제풀이

trafficActivity.smali 파일을보면

    public final String getHttpurl() {
        return this.httpurl;
    }

    public final void setHttpurl(String str) {
        Intrinsics.checkParameterIsNotNull(str, "<set-?>");
        this.httpurl = str;
    }

    public final String getHttpsurl() {
        return this.httpsurl;
    }

    public final void setHttpsurl(String str) {
        Intrinsics.checkParameterIsNotNull(str, "<set-?>");
        this.httpsurl = str;
    }

 

해당함수를 통해서,http와 https버튼을 누를때, http url과 https url을 넘겨주게된다.

 

 

    public final void run(String url) {
        Intrinsics.checkParameterIsNotNull(url, "url");
        try {
            Request request = new Request.Builder().url(url).build();
            Toast.makeText(this, "Request sent to " + url + " Please intercept using Proxy", 1).show();
            this.client.newCall(request).enqueue(new Callback()
       		}
        catch (Exception e) {
            e.printStackTrace();
        	}
    }

run함수에서는 Request.Builder를 이용하여 요청을 발생시킨다.

 

final class TrafficActivity$doPinning$1 extends Lambda implements Function1<AnkoAsyncContext<TrafficActivity>, Unit> {
    public static final TrafficActivity$doPinning$1 INSTANCE = new TrafficActivity$doPinning$1();

    TrafficActivity$doPinning$1() {
        super(1);
    }

    @Override // kotlin.jvm.functions.Function1
    /* renamed from: invoke */
    public /* bridge */ /* synthetic */ Unit mo1134invoke(AnkoAsyncContext<TrafficActivity> ankoAsyncContext) {
        invoke2(ankoAsyncContext);
        return Unit.INSTANCE;
    }

    /* renamed from: invoke  reason: avoid collision after fix types in other method */
    public final void invoke2(AnkoAsyncContext<TrafficActivity> receiver) {
        Intrinsics.checkParameterIsNotNull(receiver, "$receiver");
        try {
            CertificatePinner pinner1 = new CertificatePinner.Builder().add("owasp.org", "sha256/gdU/UHClHJBFbIdeKuyHm/Lq/aQvMLyuTtcvTEE/1JQ=").add("owasp.org", "sha256/YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=").add("owasp.org", "sha256/Vjs8r4z+80wjNcr1YKepWQboSIRi63WsWXhIMN+eWys=").build();
            OkHttpClient client = new OkHttpClient.Builder().certificatePinner(pinner1).build();
            Request.Builder builder = new Request.Builder();
            Request request = builder.url("https://owasp.org").build();
            Response response = client.newCall(request).execute();
            ResponseBody body = response.body();
            Log.v("Response", body != null ? body.string() : null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Certificate pinning버튼을 누를경우 CertificatePinner를 통해 "https://owasp.org"로 요청을 보내는 것을 확인할 수 있다.

 

프리다를 통해 자바스크립트 코드를 작성해서 CertificatePinner클래스의 check를 후킹해볼것이다.

 

console.log("Script loaded successfully");
Java.perform(function x() {
    console.log("java perform function");
    var CertificatePinner = Java.use('okhttp3.CertificatePinner');
    CertificatePinner.check.overload('java.lang.String','java.util.List').implementation = function (p0, p1) {
        console.log('! Intercepted okhttp3: ' + p0);
        return;
    };
});

프리다로 코드를 실행해보면, BurpSuite에서 패킷이 잡히는 것을 확인할 수 있다.

 

'앱 모의해킹 > AndroGoat' 카테고리의 다른 글

[AndroGoat] Binary Patching  (0) 2022.09.16
[AndroGoat] Emulator Detection bypass  (1) 2022.09.16
[AndroGoat] Root Detection Bypass  (0) 2022.09.14