/images/avatar.png

#DASP# Arithmetic Issues (3)

0x00 Info Arithmetic Issues为DASP TOP10的第三类漏洞。这类算数漏洞比较常见 also known as integer overflow and integer underflow 0x01 原理 整型溢出的原理很简单,以8位整型为例,借图说明上溢。 8位无符号整型范围[0, 255]: 8位有符号整型范围[-128, 127]: 对于下溢 (unit8)0-1=(uint8)255, (int8)(-128)-1=(int8)127. 0x02 场景 对于智能合约常见的整型溢出漏洞,会出现在如下场景: 经典场景,没有检查下溢 function withdraw(uint _amount) { require(balances[msg.sender] - _amount > 0); // 如果 _amount > msg.sender, underflow msg.sender.transfer(_amount); // 会transfer一个很大的值 balances[msg.sender] -= _amount; } off-by-one function popArrayOfThings() { require(arrayOfThings.length >= 0); arrayOfThings.length--; // length是uint,当length=0,length--会下溢翻转;同样++也需要注意 } 关键字var var会根据分配值更改为最小适配类型,下例中i=0,因此i被分配为uint8。因此i最大255,当somethingLarge>256时,i就会上溢。 for (var i = 0; i < somethingLarge; i ++) { // .

#DASP# Access Control (2)

0x00 Info 本篇为DASP TOP10的第二类漏洞Access Control。通过Parity及Rubixi合约分析理解此类型漏洞,改写OpenZeppelin中题目辅助理解。 0x01 Access Control 概念:攻击者通过合约不安全的可见性设置时可以直接访问合约的私有变量和函数,这其中需要可能需要绕过一些访问控制。 在使用 Solidity 编写合约代码时,有几种默认的变量或函数访问域关键字:private, public, external 和 internal,对合约实例方法来讲,默认可见状态为 public,而合约实例变量的默认可见状态为 private。 具体讲解参见solidity develop visibility 这里需要重点关注下external和internal,external函数为合约接口,只能被其他合约调用(在自身需通过this.f()调用)。而internal函数只能被自身调用。 此类漏洞经常会发生在以下场景: 合约使用已经遗弃的tx.origin验证调用者 通过很长的require处理大量的认证逻辑 通过delegatecall调用代理库或者代理合约 通俗讲就是一般的智能合约会通过初始化指定合约的拥有者,来实现类似赋予特权后收回合约资金的功能。而初始化函数如果能被任何人调用的话,攻击者就会将自己成为合约拥有者进行提币或恶意操作。 这里最著名的漏洞就是Parity Wallet Hack。但在介绍该漏洞前需要理解一些solidity知识。 0x02 tx.origin Solidity: Tx Origin Attacks 在solidity官方文档中已经声明禁止使用tx.origin做认证。 Quote If your wallet had checked msg.sender for authorization, it would get the address of the attack wallet, instead of the owner address. But by checking tx.origin, it gets the original address that kicked off the transaction, which is still the owner address.

#DASP# Reentrancy (1)

0x00 Info 从本篇开始学习智能合约漏洞,依据DASP TOP10。 0x01 DAO History: The History of the DAO WhitePaper: WhitePaper 白皮书 OpenSource: Github etherscan 概念理解 众筹合约,通过资金ETH换取DAO token,从而获得投票和发起议案的权利,按一定规则回馈给投资人投资项目的收益。 因此,The DAO特点: 本质是个VC,通过以太坊筹集的资金(ETH)锁定在智能合约中,通过代码主导! 出资ETH获取对应DAO代币,具有审查项目、投票表决和提出投资项目议案的权利 投资议案由全体代币持有人投票表决,一币一票,票数通过,投资项目可获得相应投资额。利用“众智”+出资额权重决定投资策略(取代传统行业投资经理)。 投资项目的收益按规则回馈股东。 The DAO is attacked the-dao-the-hack-the-soft-fork-and-the-hard-fork security-alert-dos-vulnerability-in-the-soft-fork 0x02 Reentrancy solidity基础知识 合约调用 message call bytes4 funcIdentifier = bytes4(keccak256("FuncName(paramType)")); this.call(funcIdentifier, paramValue); contract object Contract1 c = Contract1(AddressOfContract1); c.foo(); 限制 例如send花费2300gas 递归调用栈最大1024层 转币

BlockChain Resources

正所谓不积跬步无以至千里,作为区块链安全学习的第一步,本篇汇聚区块链理论与实践的各种资源,通过知行来理解这个新领域,为安全研究做好伏笔。 BlockChain 区块链技术指南 中文资料阅读站 算法演进 挖矿演进 共识机制演进 自写demo 矿池 PHP-MPOS node-open-mining-portal Powerpool BitCoin 简介:how-bitcoin-works-under-hood whitepaper:bitcoin 中文注解:比特币白皮书 个人翻译+注解 Ethereum 原理 whitepaper: White-Paper 中文:以太坊白皮书 协议架构 https://github.com/ethereum/wiki/wiki/R&D https://ethresear.ch 智能合约 Dapp state wiki:ÐApp Development 入门指南: The Hitchhiker’s Guide to Smart Contracts in Ethereum 以太坊开发入门,完整入门篇 Getting Started with Ethereum and Solidity learning-solidity-part-1-deploy-a-contract 开发事例: Create a Hello World Contract in ethereum Create a Token Contract Create a Crowdsale Contract How to create a private Ethereum network Comments Feed 客户端开发环境 Ethereum Clients IDE: remix truffle 模拟环境:testrpc 客户端: 全节点 geth 轻节点 parity cli:https://ethereum.

内嵌React的android应用流量加解密

0x00 背景 最近在做测试时发现应用使用 facebook 的 react-native 进行混合开发,对于想了解 react-native 的同学,可以查阅github和官方文档,网上也有很多 android 内嵌 react-native 进行混合开发的环境搭建及教程供学习,例如:https://blog.csdn.net/u011148116/article/details/58178348。 该应用核心业务接口数据加密,且加密逻辑在本地js中实现,而测试过程有代理明文抓包改参需求,而研究一二,并记录过程。 0x01 通信加解密历史 终端应用渗透测试包括 客户端<–通信–>服务端,客户端测试可以通过各种逆向反编译、动态调试、hook框架分析逻辑及攻击面,而服务端安全则需要通过中间人的方式抓包改参(人工、漏扫、fuzz)来挖掘服务端漏洞。 而现有的app基本都使用https传输,对数据敏感的应用会做二次加密或格式化序列化处理。针对https的原理和绕过可以参考android网络请求-证书认证,而对于二次加密,则需要逆向分析客户端代码了。 常见的加解密逻辑都会在java层或native层,通过url、头关键字、请求关键字、加密算法、log等关键字在反编译代码中搜寻定位。 绕过加密手段有: hook插件+代理插件的方式 hook插件+server+代理插件的方式 其核心都是在代理中获取明文数据,而明文加密的操作放在插件中。 hook插件+代理插件的方式hook插件+代理插件 " hook插件+代理插件的方式 hook插件+server+代理插件的方式hook插件+server+代理插件 " hook插件+server+代理插件的方式 0x02 react-native js解密 本次测试开始采用通用方式,在反编译代码中搜寻蛛丝马迹,然并卵,本以为请求逻辑做在了native中,简单搜索System.loadLibrary也未确定可疑so文件。 故通过解压apk,全局搜索接口关键字: grep -rn "xxx" . 在 assets 文件下的js文件中发现关键字: 可确定使用js+android混合开发,而网络请求与数据加密均由js实现。 那我们思路就是js强制发明文,经过burp加密发送;或者经过server加密,burp发送加密数据。 ok,思路清晰后,我们就要带着如下问题进行尝试: Question js中post数据构成逻辑为何?如何强制明文? 两种方式工作量对比,若采用burp加密,是复现js加密算法,还是加载js?若采用server加密,改如何构建c(burp)-s(server)? server我使用擅长的python实现,那如何在python中运行js? 首先来看第一个问题: js文件index.android.bundle未做加密和强混淆,通过格式化即可看到代码原貌,通过关键字(箭头所指)确定发送请求和参数构造(图中文字)代码: 而参数经过一系列函数的运算加密生成: 发送明文也很简单,直接修改js代码 return r 即可,这里也打消在burp插件中复现js加密逻辑的想法,真的很复杂。 Info 这里因为修改了apk的资源文件,重压缩打包后需要签名,否则安装报错。 接着看第二个问题:

android网络请求&证书认证

0x00 目的 通过使用HttpClinet、HttpURLConnect、Volley、Okhttp、Retrofit及Webview,快速识别android网络请求框架为了能定位关键代码,完全理解不正确及正确的证书、域名及sslpinning校验过程。 0x01 HttpClient & HttpURLConnection 发送请求 android 6.0 删除HttpClient类库,仍需使用的方法: eclipse:libs中加入org.apache.http.legacy.jar AS:在build.gradle中加入 android { useLibrary 'org.apache.http.legacy' } 使用HttpClient发送Http GET请求 HttpClient mHttpClient = new DefaultHttpClient(); HttpGet mHttpGet = new HttpGet(url); HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet); HttpEntity mHttpEntity = mHttpResponse.getEntity(); DefaultHttpClient with default constructor is not compatible with TLS 1.2 建议使用SystemDefaultHttpClient代替: HttpClient client = new SystemDefaultHttpClient(); or HttpClient client = HttpClientBuilder.create().useSystemProperties().build(); 使用HttpURLConnection发送Http GET请求 URL url = new URL(url); HttpURLConnection urlConnection = (HttpURLConnection)url.