今天地址为:0xEc82b4564AE9CC74eA164c1cee353A4E1dEB4EA7 的朋友在NFT上遭遇了一次“伪装空投攻击”。
攻击场景还原:他早上起来发现自己的Doodle地址上面多了一个空投space doodle,然后一查发现价值不菲,于是他兴高采烈马上就去挂单,但是挂单之后,发现一些地方不对,比如在同样的价值区,并未发现自己的挂单。他向我咨询是怎么回事,并且希望了解相关NFT的稀有度查询数据。
就在这个时候,他发现自己的doodles被转移走了。
我认真的阅读他提供的相关信息,发现空投的并不是一个完整的NFT而是一个erc1155协议,我猜测是一个共管协议,因为上面显示的是共管标识。一旦获得该种类的空投,如果挂单授权,可能在这一步上面涉及私钥泄露,然后钱包里面的NFT和token就会被盗。
这应该是一种非常常见的黑客盗取NFT的形式,希望大家引以为戒。每当NFT钱包里面多了一些乱七八糟的空投的时候,一定要认真查阅官方信息,一切以官方信息为准。
另外,由于硬件钱包目前不支持NFT的共管授权,所以硬件钱包在这种攻击上面是无法挂单的,在此由衷感谢@今天派派最帅 ,他家的护盾保护了我手里的NFT。
——土澳大师兄
最为一个长期混迹于EVM开发的人,第一反应就是不可能,不存在。我从来没听说过有什么共管协议,鉴于大师兄只是一个KOL,并不是一个专业的技术人员,所以不必追究错误,有预警之心是非常好的。
那既然不是所谓的共管协议,那这到底怎么做到的呢。我简单的在我的钱包里面翻找了一下,终于在一个Azuki的钱包里面找到了所谓的那个space doodle。那么,分析开始。
PS:这里提前说明一下,我用了10分钟进行分析,实际上得到的结果,就是很简单操作钱包授权而已,但是如果你感兴趣,可以继续往下看。
众所周知,在没有任何交互的情况下,任何人都没有办法从你钱包里面转走任何东西。
如果说你的东西被转走了,那么只有两个可能,1.私钥被盗 2.签名了交易或者执行了交易。
所以,当我们挂单后,发现自己的挂单没有成功,会怎么做?大部分人的第一反应肯定是去寻找项目方信息进行反馈,而这里就上了第一个当。

来到这个项目的首页,可以看到一个蓝色的链接特别显目,并且除了网站链接和etherscan链接就没有任何其他信息,所以大部分人应该就会进入他精心设计的网站。
当我们进入他网站后,效果是这样。

注意现在这个域名。
我第一次进入的时候,我选择了一个空钱包进行链接,在链接成功后,网站异常的闪动让我感到奇怪。此时我注意了一下域名,我发现已经自动转跳到了真正的doodle网站。
非常有意思,按照我的猜测就是,如果你的钱包没有攻击价值,就自动的跳到正版网站。
为了验证猜测,我对网站的源码进行了一番分析。

查看源码,可以看到是一堆混淆过的js代码,但是这种混淆其实毫无意义。在我的眼前根本就无处可藏。将其反混淆,并且反运行时字符串后。进行代码分析。可以看到一些关键内容。
可以看到链接钱包的代码如下,当完成链接后,会执行以下代码。

这里可以看到最后一行。非常有迷惑性,当你的钱包地址里面没有攻击列表中的nft时,则不会执行任何操作,并且跳到官网。
而如果你有这些nft,就会自动的setApprovalForAll,等你approval完成后,再跳到官网,让你感觉不到任何异常。
我在代码中发现了243行合约地址,也就是说,如果你的钱包里面有这243个NFT,就会进行攻击操作。
列表如下,如果你感兴趣可以看看,如果不感兴趣可以跳过。
{
'0xd4e4078ca3495de5b1d4db434bebc5a986197782': 0x0,
'0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d': 0x0,
'0x9c8ff314c9bc7f6e59a9d9225fb22946427edc03': 0x0,
'0x08d7c0242953446436f34b4c78fe9da38c73668d': 0x0,
'0x22c36bfdcef207f9c0cc941936eff94d4246d14a': 0x0,
'0x57a204aa1042f6e66dd7730813f4024114d74f37': 0x0,
'0x23581767a106ae21c074b2276d25e5c3e136a68b': 0x0,
'0x348fc118bcc65a92dc033a951af153d14d945312': 0x0,
'0xed5af388653567af2f388e6224dc7c4b3241c544': 0x0,
'0x620b70123fb810f6c653da7644b5dd0b6312e4d8': 0x0,
'0x60e4d786628fea6478f785a6d7e704777c86a7c6': 0x0,
'0x8a90cab2b38dba80c64b7734e58ee1db38b8992e': 0x0,
'0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b': 0x0,
'0xc541fc1aa62384ab7994268883f80ef92aac6399': 0x0,
'0xa3aee8bce55beea1951ef834b99f3ac60d1abeeb': 0x0,
'0xba30e5f9bb24caa003e9f2f0497ad287fdf95623': 0x0,
'0x9930929903f9c6c83d9e7c70d058d03c376a8337': 0x0,
'0x86825dfca7a6224cfbd2da48e85df2fc3aa7c4b1': 0x0,
'0x86357a19e5537a8fba9a004e555713bc943a66c0': 0x0,
'0x341a1c534248966c4b6afad165b98daed4b964ef': 0x0,
'0x7bd29408f11d2bfc23c34f18275bbf23bb716bc7': 0x0,
'0xbd4455da5929d5639ee098abfaa3241e9ae111af': 0x0,
'0x282bdd42f4eb70e7a9d9f40c8fea0825b7f68c5d': 0x0,
'0xedb61f74b0d09b2558f1eeb79b247c1f363ae452': 0x0,
'0x306b1ea3ecdf94ab739f1910bbda052ed4a9f949': 0x0,
'0x59468516a8259058bad1ca5f8f4bff190d30e066': 0x0,
'0x1a92f7381b9f03921564a437210bb9396471050c': 0x0,
'0xe785e82358879f061bc3dcac6f0444462d4b5330': 0x0,
'0x7d8820fa92eb1584636f4f5b8515b5476b75171a': 0x0,
'0x9df8aa7c681f33e442a0d57b838555da863504f3': 0x0,
'0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb': 0x0,
'0xdd012153e008346591153fff28b0dd6724f0c256': 0x0,
'0xb668beb1fa440f6cf2da0399f8c28cab993bdd65': 0x0,
'0x513cd71defc801b9c1aa763db47b5df223da77a2': 0x0,
'0x5b7622ded96511639ddc12c86eb2703331ca2c78': 0x0,
'0xc9677cd8e9652f1b1aadd3429769b0ef8d7a0425': 0x0,
'0x9705a7113363a383c8a96689e20286abe6612bb3': 0x0,
'0x059edd72cd353df5106d2b9cc5ab83a52287ac3a': 0x0,
'0x08ba8cbbefa64aaf9df25e57fe3f15ecc277af74': 0x0,
'0xedc3ad89f7b0963fe23d714b34185713706b815b': 0x0,
'0xce17f8ef13cf67da6eab86e31360102eea8609ff': 0x0,
'0x6dc6001535e15b9def7b0f6a20a2111dfa9454e2': 0x0,
'0x6fc3ad6177b07227647ad6b4ae03cc476541a2a0': 0x0,
'0x9168224fd1033ca25aaebae9eff39c92bd15231c': 0x0,
'0xf81ead7c021ef1aef78ec1ffe1e4abd0ecdb216d': 0x0,
'0x6d4bbc0387dd4759eee30f6a482ac6dc2df3facf': 0x0,
'0x34d85c9cdeb23fa97cb08333b511ac86e1c4e258': 0x0,
'0xf54cc94f1f2f5de012b6aa51f1e7ebdc43ef5afc': 0x0,
'0x1cb1a5e65610aeff2551a50f76a87a7d3fb649c6': 0x0,
'0x8a939fd297fab7388d6e6c634eee3c863626be57': 0x0,
'0x78d61c684a992b0289bbfe58aaa2659f667907f8': 0x0,
'0x496a2d17a89cbc4248e9b52c8003a50c648fbca0': 0x0,
'0xae3d8d68b4f6c3ee784b2b0669885a315ba77c08': 0x0,
'0xe0176ba60efddb29cac5b15338c9962daee9de0c': 0x0,
'0x0825f050e9b021a0e9de8cb1fb10b6c9f41e834c': 0x0,
'0x892848074ddea461a15f337250da3ce55580ca85': 0x0,
'0xc9d8f15803c645e98b17710a0b6593f097064bef': 0x0,
'0x20ed6cdf9344b3a187063a3ff4d883b6b1947b81': 0x0,
'0xccc441ac31f02cd96c153db6fd5fe0a2f4e6a68d': 0x0,
'0x7cc7add921e2222738561d03c89589929cefcf21': 0x0,
'0x16de9d750f4ac24226154c40980ef83d4d3fd4ad': 0x0,
'0xb6329bd2741c4e5e91e26c4e653db643e74b2b19': 0x0,
'0xab0b0dd7e4eab0f9e31a539074a03f1c1be80879': 0x0,
'0xf661d58cfe893993b11d53d11148c4650590c692': 0x0,
'0x2250d7c238392f4b575bb26c672afe45f0adcb75': 0x0,
'0xd2f668a8461d6761115daf8aeb3cdf5f40c532c6': 0x0,
'0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d': 0x0,
'0x959e104e1a4db6317fa58f8295f586e1a978c297': 0x0,
'0x3110ef5f612208724ca51f5761a69081809f03b7': 0x0,
'0x521f9c7505005cfa19a8e5786a9c3c9c9f5e6f42': 0x0,
'0x31b6d1289f96818e79dbb271bf77e8132b86e814': 0x0,
'0x79fcdef22feed20eddacbb2587640e45491b757f': 0x0,
'0x3903d4ffaaa700b62578a66e7a67ba4cb67787f9': 0x0,
'0xd0318da435dbce0b347cc6faa330b5a9889e3585': 0x0,
'0x529a4e15b3ce13523417f945ecd0959ff71e0a9e': 0x0,
'0x6080b6d2c02e9a0853495b87ce6a65e353b74744': 0x0,
'0xbd3531da5cf5857e7cfaa92426877b022e612cf8': 0x0,
'0x75e95ba5997eb235f40ecf8347cdb11f18ff640b': 0x0,
'0x2acab3dea77832c09420663b0e1cb386031ba17b': 0x0,
'0x960b7a6bcd451c9968473f7bbfd9be826efd549a': 0x0,
'0x0bd4d37e0907c9f564aaa0a7528837b81b25c605': 0x0,
'0x28472a58a490c5e09a238847f66a68a47cc76f0f': 0x0,
'0x03ef30e1aee25abd320ad961b8cd31aa1a011c97': 0x0,
'0x9c80777cae192e5031c38a0d951c55730ecc3f5e': 0x0,
'0x6e9da81ce622fb65abf6a8d8040e460ff2543add': 0x0,
'0x5cc5b05a8a13e3fbdb0bb9fccd98d38e50f90c38': 0x0,
'0x0972290a80333d19c6703073c3e57134a4ca0127': 0x0,
'0xb4d06d46a8285f4ec79fd294f78a881799d8ced9': 0x0,
'0x3abedba3052845ce3f57818032bfa747cded3fca': 0x0,
'0x38a6fd7148c4900338e903258b5e289dfa995e2e': 0x0,
'0xfe8c6d19365453d26af321d0e8c910428c23873f': 0x0,
'0x950b9476a4de757bb134483029ac4ec17e739e3a': 0x0,
'0xa1d4657e0e6507d5a94d06da93e94dc7c8c44b51': 0x0,
'0x5bd815fd6c096bab38b4c6553cfce3585194dff9': 0x0,
'0x9c8d2f53f6bff84458f1c84fdaa1e4852ca958e3': 0x0,
'0x880644ddf208e471c6f2230d31f9027578fa6fcc': 0x0,
'0x5be99338289909d6dbbc57bb791140ef85ccbcab': 0x0,
'0x698fbaaca64944376e2cdc4cad86eaa91362cf54': 0x0,
'0xd7b397edad16ca8111ca4a3b832d0a5e3ae2438c': 0x0,
'0x86c10d10eca1fca9daf87a279abccabe0063f247': 0x0,
'0x09233d553058c2f42ba751c87816a8e9fae7ef10': 0x0,
'0x9378368ba6b85c1fba5b131b530f5f5bedf21a18': 0x0,
'0x0c2e57efddba8c768147d1fdf9176a0a6ebd5d83': 0x0,
'0xef0182dc0574cd5874494a120750fd222fdb909a': 0x0,
'0xeb3a9a839dfeeaf71db1b4ed6a8ae0ccb171b227': 0x0,
'0x1b829b926a14634d36625e60165c0770c09d02b2': 0x0,
'0xb5c747561a185a146f83cfff25bdfd2455b31ff4': 0x0,
'0x123b30e25973fecd8354dd5f41cc45a3065ef88c': 0x0,
'0x4b61413d4392c806e6d0ff5ee91e6073c21d6430': 0x0,
'0x97597002980134bea46250aa0510c9b90d87a587': 0x0,
'0x8943c7bac1914c9a7aba750bf2b6b09fd21037e0': 0x0,
'0x0b4b2ba334f476c8f41bfe52a428d6891755554d': 0x0,
'0x7ea3cca10668b8346aec0bf1844a49e995527c8b': 0x0,
'0x7948f7ff1158b338a898e80ce8b1c3c964a80cec': 0x0,
'0xf61f24c2d93bf2de187546b14425bf631f28d6dc': 0x0,
'0x495b01c1bc3b9203fde4362d9913c692fb661f3f': 0x0,
'0xbad6186e92002e312078b5a1dafd5ddf63d3f731': 0x0,
'0x0cfb5d82be2b949e8fa73a656df91821e2ad99fd': 0x0,
'0x72d47d4d24018ec9048a9b0ae226f1c525b7e794': 0x0,
'0x7ecb204fed7e386386cab46a1fcb823ec5067ad5': 0x0,
'0xbd275ce24f32d6ce4e9d9519c55abe9bc0ed7fcf': 0x0,
'0x35471f47c3c0bc5fc75025b97a19ecdde00f78f8': 0x0,
'0x5af0d9827e0c53e4799bb226655a1de152a425a5': 0x0,
'0x9a38dec0590abc8c883d72e52391090e948ddf12': 0x0,
'0xcefc0a83564dd2a083b83b4a73bbae97e40fa7ea': 0x0,
'0x7afe30cb3e53dba6801aa0ea647a0ecea7cbe18d': 0x0,
'0xa6a5ec7b1b8a34ff2dcb2926b7c78f52a5ce3b90': 0x0,
'0xd73acd7f5099fdd910215dbff029185f21ffbcf0': 0x0,
'0xfcb1315c4273954f74cb16d5b663dbf479eec62e': 0x0,
'0x1afef6b252cc35ec061efe6a9676c90915a73f18': 0x0,
'0x67d9417c9c3c250f61a83c7e8658dac487b56b09': 0x0,
'0x7afeda4c714e1c0a2a1248332c100924506ac8e6': 0x0,
'0x970d5e0bd5c4f193fccf7fd579590c5f5c69b2d9': 0x0,
'0x98a0227e99e7af0f1f0d51746211a245c3b859c2': 0x0,
'0xc1caf0c19a8ac28c41fe59ba6c754e4b9bd54de9': 0x0,
'0x364c828ee171616a39897688a831c2499ad972ec': 0x0,
'0x13927739076014913a3a7c207ef84c5be4780014': 0x0,
'0x25cd67e2dfec471acd3cdd3b22ccf7147596dd8b': 0x0,
'0xa5c0bd78d1667c13bfb403e2a3336871396713c5': 0x0,
'0x8d4100897447d173289560bc85c5c432be4f44e4': 0x0,
'0x4a8c9d751eeabc5521a68fb080dd7e72e46462af': 0x0,
'0x4db1f25d3d98600140dfc18deb7515be5bd293af': 0x0,
'0xad9fd7cb4fc7a0fbce08d64068f60cbde22ed34c': 0x0,
'0x4a537f61ef574153664c0dbc8c8f4b900cacbe5d': 0x0,
'0x3fe1a4c1481c8351e91b64d5c398b159de07cbc5': 0x0,
'0x8ffb9b504d497e4000967391e70d542b8cc6748a': 0x0,
'0xf4ee95274741437636e748ddac70818b4ed7d043': 0x0,
'0xa5e25b44b01e09b7455851838c76cde68d13e29f': 0x0,
'0x177ef8787ceb5d4596b6f011df08c86eb84380dc': 0x0,
'0x2f102e69cbce4938cf7fb27adb40fad097a13668': 0x0,
'0xd78b76fcc33cd416da9d3d42f72649a23d7ac647': 0x0,
'0xc8e1de8dc39a758c7a50f659b53f787e0f1398bd': 0x0,
'0x58519ea95cdfad3622c4c574e61a58fa257d9e77': 0x0,
'0xe70da20a2b10d60ca620a4e494fe2b37c9499e97': 0x0,
'0x226bf5293692610692e2c996c9875c914d2a7f73': 0x0,
'0x0b1d6565d88F9Bf6473e21c2AB58D28A495d7BB5': 0x0
}
最有意思的事情是,我在反编译他合约内容的时候,发现他的合约并不是一个真实合约,而是一个代理合约。

而他的实际合约为

这个名字我总感觉有点眼熟,是不是之前就有这种攻击案例。
那么为什么要部署一个代理合约而不是重新部署一份呢?
当然是为了省下GAS费啊!部署一个真实的NFT合约需要接近130u的gas,但是部署一个代理合约只需要60u。是不是骑着单车去酒吧?
其实说来说去,很多人都是不愿意承认自己的操作,大部分人认为一个网站,长的像官网,就是官网,就会默认放心所有的操作,往往是这种粗心,才会导致人财两空。这种攻击手段就是非常简单的钓鱼攻击,用一个小小的鱼饵,往往就可以钓到很多大鱼。
如果觉得我写的不错,欢迎请我喝一杯咖啡:0x954F1D97aE9c4a27d012e70cCaAfde29822B3F2B
如果有什么技术方面想要交流的,随时都欢迎私信我。

