freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Android网络库详解
TideSec 2022-07-20 09:59:28 37713
所属地 山东省

网络库:HttpURLConnection

HttpURLConnection介绍

一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。
虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使
用和扩展它。继承至URLConnection,抽象类,无法直接实例化对象。通过调用openCollection()
方法获得对象实例,默认是带gzip压缩的;

HttpURLConnection的使用步骤

使用HttpURLConnection的步骤如下:

1、创建一个URL对象: URL url = new URL(https://www.baidu.com);
2、调用URL对象的openConnection( )来获取HttpURLConnection对象实例: HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3、设置HTTP请求使用的方法:GET或者POST,或者其他请求方式比如:PUT conn.setRequestMethod("GET");
4、设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头 conn.setConnectTimeout(6*1000); conn.setReadTimeout(6 * 1000);
5、调用getInputStream()方法获得服务器返回的输入流,然后输入流进行读取了 InputStream in = conn.getInputStream();
6、最后调用disconnect()方法将HTTP连接关掉 conn.disconnect();

HOOK HttpURLConnection

创建一个URL对象: URL url = new URL(https://www.baidu.com);

如果想自吐URL(https://www.baidu.com)则应该hook URL的构造函数

com.example.network on (google: 8.1.0) [usb] # android hooking search classes URL

-w829
需单独hook构造函数java.net.URL.\$init

com.example.network on (google: 8.1.0) [usb] # android hooking watch class_method java.net.URL.$init --dump-args --dump-backtrace --dump-re
turn

可以发现在手机每点击一下刷新验证码,就会弹出新的请求。
-w1558
然后可以编写自吐脚本,打印出经过的url地址

frida -U -f com.example.network -l 20201013.js  --no-pause

-w905
使用该自吐脚本尝试另一款APP做实验

frida -U -f com.cz.babySister -l 20201013.js  --no-pause

-w1327
hookjava.io.PrintWriter的write方法打印出内容:

com.cz.babySister on (google: 8.1.0) [usb] # android hooking watch class_method java.io.PrintWr
iter.write --dump-args --dump-backtrace --dump-return

-w1403
编写hook脚本将java.io.PrintWriter.write内容进行打印,可以发现显示出了用户输入的账号和密码。
-w1129
最终HttpURLConnection自吐脚本如下

function hook_HttpUrlConnection(){

    Java.perform(function(){
            // java.net.URL.URL  ($init) (得到URL)

    Java.use("java.net.URL").$init.overload('java.lang.String').implementation = function (str){
        var result = this.$init(str)
        console.log("result , str => ",result,str);
        return result;
    }

    //HttpURLConnection setRequestProperty 得到各种请求头、属性等
    Java.use("com.android.okhttp.internal.huc.HttpURLConnectionImpl").setRequestProperty.implementation = function(str1,str2){
        var result = this.setRequestProperty(str1,str2);
        console.log(".setRequestProperty result,str1,str2->",result,str1,str2);
        return result; 
    }

    Java.use("com.android.okhttp.internal.huc.HttpURLConnectionImpl").setRequestMethod.implementation = function(str1){
        var result = this.setRequestMethod(str1);
        console.log(".setRequestMethod result,str1,str2->",result,str1);
        return result; 
    }
    //java.io.PrintWriter write 得到输入内容
    Java.use("java.io.PrintWriter").write.overload('java.lang.String').implementation = function(str1){
        var result = this.write(str1);
        console.log(".write result,str1->",result,str1);
        return result; 
    }



    })

}
setImmediate(hook_HttpUrlConnection)

网络库:okhttp3+logging

OKHttp简介

OKHttp是一个处理网络请求的开源项目,Android当前最火热网络框架。

OKHttp的功能

1、PUT,DELETE,POST,GET等请求
2、文件的上传下载
3、加载图片(内部会图片大小自动压缩)
4、支持请求回调,直接返回对象、对象集合
5、支持session的保持

HOOK OkHttp3

1、OkhttpClient对象

example类创建一个OkhttpClient对象

OkHttpClient client = new OkHttpClient();

可以使用objection查找该okhttp3.OkHttpClient实例,并查看该属性、域和方法

com.roysue.octolesson2ok3 on (google: 8.1.0) [usb] # plugin load /Users/tale/.objection/plugins/Wallbreaker
Loaded plugin: wallbreaker
com.roysue.octolesson2ok3 on (google: 8.1.0) [usb] # plugin wallbreaker classsearch OkHttpClient
com.android.okhttp.OkHttpClient$1
com.android.okhttp.OkHttpClient
okhttp3.OkHttpClient$1
okhttp3.OkHttpClient$Builder
okhttp3.OkHttpClient
com.roysue.octolesson2ok3 on (google: 8.1.0) [usb] # plugin wallbreaker objectsearch okhttp3.OkHttpClient
[0x26c2]: okhttp3.OkHttpClient@dc28b06
com.roysue.octolesson2ok3 on (google: 8.1.0) [usb] # plugin wallbreaker objectdump --fullname 0x26c2

-w925
2、Request对象

// 构造request
Request request = new Request.Builder()
        .url(url) 
        .build();

查看该类com.android.okh ttp.internal.huc.HttpURLConnectionImpl
发现每点击刷新一下,会增加一新的实例,然后可以去查看该域
-w1287

3、发起异步请求
在将Request对象封装成Call对象后,每次enqueue都会产生一次真实的网络请求

// 发起异步请求
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        call.cancel();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {

        //打印输出
        Log.d(TAG, response.body().string());

    }
}
public class example {

    // TAG即为日志打印时的标签
    private static String TAG = "learnokhttp";


    // 新建一个Okhttp客户端
    //OkHttpClient client = new OkHttpClient();
    OkHttpClient client = new OkHttpClient.Builder()
            .addNetworkInterceptor(new LoggingInterceptor())
            .build();

    void run(String url) throws IOException {
        // 构造request
        Request request = new Request.Builder()
                .url(url)
                .build();


        // 发起异步请求
        client.newCall(request).enqueue(new Callback() {
                                            @Override
                                            public void onFailure(Call call, IOException e) {
                                                call.cancel();
                                            }

                                            @Override
                                            public void onResponse(Call call, Response response) throws IOException {

                                                //打印输出
                                                Log.d(TAG, response.body().string());

                                            }
                                        }
        );
    }
}

-w1143
做完混淆,通过拦截器分析方法失效。

网络库:Retrofit

Retrofit简介:

Retrofit是一个RESTful的HTTP网络请求框架的封装,网络请求的工作本质上是OkHttp完成,而 Retrofit仅负责网络请求接口的封装。

Retrofit使用步骤:

1.添加Retrofit库的依赖:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'//Retrofit依赖
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'//可选依赖 解析json字符所用

网络权限:

<uses-permission android:name="android.permission.INTERNET" />

2.创建用于描述网络请求的接口
Retrofit将Http请求抽象成Java接口:采用注解描述网络请求参数和配置网络请求参数

public interface GetRequest_Interface {

    @GET("openapi.do?keyfrom=abc&key=2032414398&type=data&doctype=json&version=1.1&q=car")
    Call<Reception> getCall(@Field("name") String name);
    // @GET注解的作用:采用Get方法发送网络请求

    // getCall() = 接收网络请求数据的方法
    // 其中返回类型为Call<*>,*是接收数据的类(即上面定义的Translation类)
    // 如果想直接获得Responsebody中的内容,可以定义网络请求返回值为Call<ResponseBody>
}

3.创建Retrofit实例

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://fanyi.youdao.com/") //设置网络请求的Url地址
                .addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

4.发送请求

// 创建 网络请求接口 的实例
        GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
        //对 发送请求 进行封装
        Call<Reception> call = request.getCall("");
        call.enqueue(new Callback<Reception>() {
            //请求成功时回调
            @Override
            public void onResponse(Call<Reception> call, Response<Reception> response) {
                //请求处理,输出结果
                response.body().show();
            }
            //请求失败时候的回调
            @Override
            public void onFailure(Call<Reception> call, Throwable throwable) {
                System.out.println("连接失败");
            }
        });

          //同步请求
        try {
            Response<Reception> response = call.execute();
            response.body().show();
        } catch (IOException e) {
            e.printStackTrace();
        }

HOOK Retrofit

因Retrofit的下层为okhttp, 所以hook okhttp3一样的可以用在hook Retrofit上。
对比 Okhttp,Retrofit是一个RESTful的HTTP网络请求框架的封装。
原因:网络请求的工作本质上是OkHttp完成,而Retrofit仅负责网络请求接口的封装。
App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数、Header、Url

等信息,之后由OkHttp完成后续的请求操作。在服务端返回数据之后,OkHttp将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析。

参考资料

https://www.runoob.com/w3cnote/android-tutorial-httpurlconnection.html
https://blog.csdn.net/zhangqiluGrubby/article/details/71480546

# Android # 网络库
本文为 TideSec 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
TideSec LV.7
Tide安全团队 http://www.TideSec.com
  • 112 文章数
  • 121 关注者
某次攻防演练中对任意文件读取漏洞的利用
2023-07-05
记一次对某企业的渗透测试
2023-07-05
用户名密码加密的页面爆破学习
2023-07-05
文章目录