Jumaat, Mei 26, 2023

Smart Contract Hacking Final Free Chapter - Hacking Games Via Bad Randomness Implementations On The Blockchain

This is our final free chapter in this smart contract hacking series, hopefully you enjoyed it, I am not sure what I am going to work on next, perhaps some malware analysis, reverse engineering or maybe some hacking in the cloud. 

We are currently in 4th quarter and slammed with work so I wouldn't expect any more posts or the full blockchain release till after that eases up.

If you have any questions or comments you can hit us up at: 

@ficti0n

http://cclabs.io 


Cryptographic Implementations and Predictable PRNGs

Within operations that require random values we generally need a form of randomness coupled with our algorithm. If we do not have sufficient randomness and large character sets, we would end up with cryptographic collisions or predictable values depending what we are doing. This Is often the case in video game operations and data security encryption schemes. For example, we do not want to create random values which are predictable and repeatable based on known values or controllable values. With controllable values an attacker could duplicate the value by reverse engineering how it was originally created and what that random seed is. Also, If the value is predictable within a game, we may be able to cheat the game by creating our own valid values that exploit the perceived randomness.

Now we are not going to deep dive into cracking cryptography or brute forcing hash values. First off it takes too much time and effort. Secondly because there are easier more efficient ways of tackling cryptographic issues. Lastly, we do not have time for rabbit holes in a week-long penetration test that require us to explore many other attack vectors. Wasting a whole week on cracking a single cryptographic issue would be a terrible and inefficient penetration test leaving the rest of the target vulnerable. This may be suitable for R&D or a CTF but not for a penetration test.  

What you need to understand is that certain functions often used as randomness on the blockchain is not suitable as a source of randomness. Additionally, understanding how things are implemented will get you much farther when it comes to cryptography then attacking it directly. You do not need to break NSA level encryption by attacking it directly. Instead you should concentrate on finding insecure implementations of these algorithms to get what you need.

Oracle padding attacks are a great example of this if you were in the hacking community back in the late 2000s. The padding attack relied on error messages based on padding within blocks to determine a way to decrypt them. This was a brilliant attack vector as you didn't need to understand deep cryptographic concepts to decrypt data blocks only how blocks work and how it was implemented.  With this knowledge you could leverage the flawed implementation to get the decrypted values.

On the blockchain there are a number of insecure functionality that developers like to use when implementing random values. Most of these are very bad ideas for reasons we will discuss below.  

For Example, the following non-exhaustive but often used list of values are not suitable for randomness within sensitive operations. Usage of these types of values for any sort of calculation is always suspect for closer review:

ü  Secret keys in private variables

ü  Block Timestamps

ü  Block Numbers

ü  Block Hash values

Why you ask? Well regardless of the data being set as private on the blockchain a private variable storage value is 100% readable on the blockchain. There are no secret values. These can be queried as you saw in the storage issues chapter. Also embedding hard coded values are certainly not private as they are in the source code which may be posted directly on the blockchain. Or could be reverse engineered out of the bytecode used to deploy the contract when the source code is not available. If you can get a hold of that value, then you can violate the security of that functionality.

Secondly do not rely on predictable values for randomness especially from block data sources. Block timestamps are controlled by miners which can aid in orchestrated attacks when used as a source of randomness. Also block numbers are easy to query and create predictable attacks when used in calculations, if internal functions are using a block number, they are all using the same PRNG. Finally, block hash values are terrible to use for randomness as only the last 256 block hash values on chain actually have a real value. Anything older than 256 is reduced to 0 meaning that every calculation will use the same value of 0. We will cover that in some of our examples.

This is not an exhaustive list but instead just a small portion of bad decisions for random values. There are plenty of other values which could be used within calculations as a random seed which are also predictable. It is always important to review the data used in these calculations when reviewing smart contract functionality. So, without the need of a PHD in cryptography you should easily discern that all of the above implementation examples are terrible for the inclusion of random data within cryptographic operations.

 

Simple BlockHash Example

Let's start out taking a look at a simple example of using a blockhash value with a blocknumber value. While a hash of a block might seem like a good idea as a random number there are numerous issues with it. Firstly, a blocknumber is a known value set by a miner that persists for a set length of time and can be queried and used in an attacker's similar algorithm to produce the same result and bypass controls. But there is also an underlying vulnerability to this approach when coupled with a blockchash which we will take a look at below.

Action Steps:

ü  Open up your terminal and launch ganache-cli

ü  Type out the code below into Remix

ü  Within the Deploy Environment section dropdown change the JavaScript VM to the web3 Provider option.

ü  Deploy the contract to ganache with the deploy button in Remix

 

 

1.    pragma solidity ^0.6.6;
2.   
3.    contract simpleVulnerableBlockHash {
4.           uint32 public block_number;
5.           bytes32 public myHash;
6.   
7.           function get_block_number() public  {   
8.                   block_number = uint32(block.number);
9.           }
10. 
11.  function set_hash() public{
12.                 myHash = bytes32(blockhash(block_number));
13.         }
14. 
15.  function wasteTime() public{
16.                 uint test = uint(block.number);
17.  }
18. }

 

The simple contract above is querying for the current block number in the get_block_number function on line 8 and storing it within a block_number variable created on line 4.  This is the current block number running on the blockchain.

Then we have a function on line 11 which takes the block number and uses it with the blockhash button to retrieve the blockhash and store it in the myHash variable.

 

BlockHash Vulnerability Walk and Talk:

 

Action Steps:

ü  Execute the get_block_number function

ü  Execute the set_hash function

ü  Check the block_number value

ü  Check the myHash value

ü  Execute the wasteTime function 256 times

ü  Execute the set_hash function

ü  Check your myHash Value

ü  What happened and what implications would this have on calculations your using this value with?

 

So, we have 2 variables of a block number and a block hash associated with that block number. What's the big deal. Well let's walk through this step by step and then play around with the remaining wasteTime function on line 15 to find out.

Starting out if we have the deployed contract and we execute the get_block_number function followed by the set_hash function we will get the following result when checking the block_number and myHash variables.

 


We see the blocknumber of 3 and then a hex value representing the block hash that starts with 0x995f. Now if we were to use this hash as a random value or within some algorithm to create a random value it might work depending what we were doing and the level of security required for the length of time we need it to be perceived as random for. It wouldn't be secure but maybe good enough for your operations.  However, a blockhash has a dark little secret a developer may not be aware of.  Block hashes in Ethereum have short term memory when it comes to blocks older than 256 from the current block.  

So, what happens when we calculate a block after a time lapse? Let's give that a try by executing the wasteTime button till we reach block 259.  Waste time sets a block value and discards it to enumerate blocks for us, it doesn't actually make any real changes. Normally blocks on the Ethereum network enumerate on their own every 30 seconds and we would simply just wait for 256 blocks, but we don't have traffic on our blockchain so we will enumerate it ourselves with wasteTime.

 


After we reach block 259 we execute the set_hash function again which will take block_number of 3 which is older than 256 blocks and get the hash. If you retrieve the myHash variable again after executing the set_hash function again it results in:

 


You will notice the myHash variable is now 0x000. because blocks older than 256 from the current block are not stored and result in a value of 0.  Having a predictable value of 0 in our random algorithm can very likely create a situation where it would be easy to recreate the random number to bypass or cheat functionality in the smart contract.


Video Walkthrough of Bad Randomness:




A classical terrible example is something similar to this.

1.  Function checkWinner() public payable { 
2.     If (blockhash(blockNumber) % 2 == 0) {
3.         Msg.sender.transfer(balance);
4.     }
5.  }

 

In the example above uses a blockhash function with a blockNumber variable within its calculation. The issue with this calculation is if that blockNumber variable is more than 256 blocks old it will return Zero and based on the calculation the user will win every single time.

All the attacker would need to do is play the game to create the blocknumber variable. Then the attacker would simply wait for 256 blocks to pass before checking if he has won the game. By doing this the attacker would guarantee a win. 

 

In order to see how this would work let's take a look at a simple game of chance that implements this concept.

Action Steps:

ü  Type out this code within remix

ü  Deploy the code using Ganache and Web3 options

ü  Try to locate the vulnerability within the code

ü  Try to exploit the vulnerability this code so that you are always the winner

1.  pragma solidity ^0.6.6;
2.   
3.  contract simpleVulnerableBlockHash {
4.      
5.      uint balance = 2 ether;
6.      mapping (address => uint) blockNumber;     
7.      bool public win; 
8.      
9.      constructor() public payable{
10.        require(msg.value >= 10 ether);
11.    }
12.    
13.    function get_block_number() internal  {   
14.        blockNumber[msg.sender] = uint(block.number);
15.    }
16.    
17.    function playGame() public payable {
18.        require (msg.value >= 1 ether);
19.        get_block_number();
20.    }
21.     
22.     
23.    function checkWinner() public payable { 
24.      if (uint(blockhash(blockNumber[msg.sender])) % 2 == 0) {
25.          win = true; 
26.             msg.sender.transfer(balance);
27.      }   else{
28.             win = false;
29.         }
30.    }
31.    
32.}

 After trying to exploit this vulnerability yourself review the following video which walks you through the code and how to exploit it.

Video Walkthrough of Attacking The Game:



 

Preventing Randomness Summary

The best way to prevent these issues is to avoid on chain predictable values or secret values as your seed to operations and calculations.  We can do this with trusted external Oracles.  Oracles are external data sources that your contract can use when it needs random values or trusted data.  There are projects that specifically solve this problem for example ChainLink which has networks of Oracle nodes that handle data queries and provide back trusted verified data including random numbers.  A simple example for using Chainlink for a random number is found at the following link:

https://docs.chain.link/docs/get-a-random-number

It is always a good idea to avoid on chain secret data or block related information when performing any sort of sensitive operation and instead utilize an Oracle.  

 

Bad Randomness References

https://docs.chain.link/docs/get-a-random-number

https://nvd.nist.gov/vuln/detail/CVE-2018-14715More articles

Hacking Windows 95, Part 2

In the Hacking Windows 95, part 1 blog post, we covered that through a nasty bug affecting Windows 95/98/ME, the share password can be guessed in no time. In this article, I'm going to try to use this vulnerability to achieve remote code execution (with the help of publicly available tools only).

The first thing we can do when we have read access to the Windows directory through the share, is to locate all the *.pwl files on the c:\windows directory, copy them to your machine where Cain is installed, switch to Cracker tab, pwl files, load the pwl file, add username based on the filename, and try to crack it. If you can't crack it you might still try to add a .pwl file where you already know the password in the remote windows directory. Although this is a fun post-exploitation task, but still, no remote code execution. These passwords are useless without physical access.


One might think that after having a share password and user password, it is easy to achieve remote code execution. The problem is:
  • there is no "at" command (available since Windows 95 plus!)
  • there is no admin share
  • there is no RPC
  • there is no named pipes
  • there is no remote registry
  • there is no remote service management
If you think about security best practices, disabling unnecessary services is always the first task you should do. Because Windows 95 lacks all of these services, it is pretty much secure!

During my quest for a tool to hack Windows 95, I came across some pretty cool stuff:
LanSpy

But the best of the best is Fluxay, which has been written by chinese hackers. It is the metasploit from the year 2000. A screenshot is worth more than a 1000 words. 4 screenshot > 4 thousand words :)





It is pretty hard to find the installer, but it is still out there!

But at the end, no remote code execution for me.

My idea here was that if I can find a file which executes regularly (on a scheduled basis), I can change that executable to my backdoor and I'm done. Although there is no scheduler in the default Windows 95, I gave it a try. 

Let's fire up taskman.exe to get an idea what processes are running:


Looks like we need a more powerful tool here, namely Process Explorer. Let's try to download this from oldapps.com:


LOL, IE3 hangs, can't render the page. Copying files to the Win95 VM is not that simple, because there are no shared folders in Win95 VM. And you can't use pendrives either, Win95 can't handle USB (at least the retail version). After downloading the application with a newer browser from oldapps, let's start Process Explorer on the test Windows 95.


Don't try to download the Winsocks 2 patch from the official MS site, it is not there anymore, but you can download it from other sites

Now let's look at the processes running:


After staring it for minutes, turned out it is constant, no new processes appeared.
Looking at the next screenshot, one can notice this OS was not running a lot of background processes ...


My current Win7 has 1181 threads and 84 processes running, no wonder it is slow as hell :)

We have at least the following options:
  1. You are lucky and not the plain Windows 95 is installed, but Windows 95 Plus! The main difference here is that Windows 95 Plus! has built-in scheduler, especially the "at" command. Just overwrite a file which is scheduled to execution, and wait. Mission accomplished!
  2. Ping of death - you can crash the machine (no BSOD, just crash) with long (over 65535 bytes) ICMP ping commands, and wait for someone to reboot it. Just don't forget to put your backdoor on the share and add it to autoexec.bat before crashing it. 
  3. If your target is a plain Windows 95, I believe you are out of luck. No at command, no named pipes, no admin share, nothing. Meybe you can try to fuzz port 137 138 139, and write an exploit for those. Might be even Ping of Death is exploitable?
Let's do the first option, and hack Windows 95 plus!
Look at the cool features we have by installing Win95 Plus!


Cool new boot splash screen!


But our main interest is the new, scheduled tasks!


Now we can replace diskalm.exe with our backdoor executable, and wait maximum one hour to be scheduled.

Instead of a boring text based tutorial, I created a YouTube video for you. Based on the feedbacks on my previous tutorialz, it turned out I'm way too old, and can't do interesting tutorials. That's why I analyzed the cool skiddie videoz, and found that I have to do the followings so my vidz won't suck anymore:
  • use cool black windows theme
  • put meaningless performance monitor gadgets on the sidebar
  • use a cool background, something related with hacking and skullz
  • do as many opsec fails as possible
  • instead of captions, use notepad with spelling errorz
  • there is only one rule of metal: Play it fuckin' loud!!!!
More articles

Adding RGB To A 6 Year Old PC In A 16 Year Old Case!

This project was something to get my oldest daughter interested in building PC's.  She got a bit interested when she saw me looking at parts to upgrade to a new machine; my current PC was built only a few months after she was born.

She got interested in the cases, specifically the ones where the pictures had glorious RGB set to "Unicorn Barf" mode.  She immediately asked if my new machine could look like that and suffice it to say I'll be spending some extra money on RGB parts and a case to help show it off.



When she found out that my current computer would be setup so she and my wife could have a place to play, she asked if we could make it have unicorn barf as well.

Since I still had an old original Antec LANboy windowed case laying around upstairs, I decided to buy some cheap RGB parts and move my current machine into that case with all the new fancy LED's, provided that she would help me do it.

To my joy, she was super excited to do it and so we had our own special Daddy-Daughter PC project.

My parts arrived the next day, on Sunday no less, so we immediately got to work around 11AM. My youngest wanted to hang around as well, so we took a group shot.



First I wanted to see if I could salvage an old power supply out of a very old PC that we had used as a HTPC, which needed to move out of our entertainment center anyway.  Sadly it wasn't going to work with my existing build, but my daughter did enjoy taking all the parts out of it to be recycled. Nothing needed to be saved so she got to pull lots of parts out and was excited.








Next was complete disassembly of my existing machine. True to its era, it was built into an Antec One case. Here is my daughter using it to play some Minecraft.


Here is how it looked with both panels off, it wasn't perfect cable management, but it was pretty clean and allowed for good airflow.



2013 Build Specs:

Intel i5-4570
16Gb DDR3 RAM
GTX 760
120GB SATA 6G SSD
1TB HDD
512GB SATA 6G SSD (added this XMas from a friend so my games don't take forever to load anymore).



As we were removing parts I decided to start cleaning up the old Lanboy dust wise and I started mounting the hard drives to the removable drive cage.  Yes kids, back in 2003, removable drive cages were an amazing luxury for system building.  Compare this with the Antec One from 2013 and it's tool free drive sleds that mount from the opposite side panel and I was starting to appreciate how much cases advanced over time.

And then the Lanboy really started to show its age.

You see my system has two SSD's and one HDD.  Not bad for a six year old computer, and while the Lanboy has space to the drives, it doesn't necessarily have space for the drives AND my massive video card.

I spent no less than an hour trying to tetris my way into fitting things properly. Unfortunately the top most drive bays on the tray require the HDD to be further forward, because, um...well...

You see kids, back in the day we used to have 3.5" drive bays that would stick out to the front of the case. For floppy disk drives, ZIP drives, or if we got fancy in early 2003, a SD card reader.

Sadly, the covers for the 3.5" drive bays on the front of the case wouldn't let the HDD mount properly and I couldn't squeeze in my massive GeForce GTX 760 and the drive.

In the end, I installed my SDD drives and then used only two screws (with rubber grommets at least) to secure the HDD at the top of the drive tray.  Luckily the drive doesn't really travel and is secure enough.

So I finally got everything mounted in the case, but nothing was cabled up.



And here is where the Lanboy started to show its old age even more.

The other side panel does not come off at all and there is almost no where to easily do any cable management. This is when the nightmares of my old non-LED lit build from 16 years ago came back to haunt me.

Still, I managed then and I managed now; it was just...painful. Even simple things like inserting the power supply was a strain.  I did the best I could, there aren't any cable tubes or sleeves that I had lying around, but I did manage to use cable ties and some double sided tape as needed to hide just about everything I could.

In the end I think it looked pretty good.



It was even better once I powered it on and the light show started. Everything booted up and was working fine too.


Front shot, you can also see my other very old Antec case which houses my server.




Conclusion

An old PC into an even older case was an odd build, but my daughter loves it and we had fun building it together.

The LED's aren't really controllable, well the two 80mm (yes, that's right this case only has 80mm fan mounts!) are set to permanent unicorn barf mode, but I technically have a small remote to control the LED strips.

Building the new machine will be a cakewalk in comparison. I'm looking at a Corsair cube case, though I've not 100% settled on it yet. I'm waiting for the Ryzen 3000 series to get released before I pull the trigger, and man waiting for that is hard. My daughter is already excited to help with that too, which makes it even better.  The only downside is that all the extra RGB stuff adds a bit to the overall cost, but my daughter is worth it and if I'm honest I like it too.

Khamis, April 13, 2023

Greetings jkkbatuban.iszu

Hi jkkbatuban.iszu
I am looking for a Business partner.

Khamis, April 06, 2023

WE HAVE OIL AND FERTILIZER PRODUCTS FOR SALE

Dear Sir,
   We are direct mandate company in partnership with various reliable oil refineries in Russia federation and Kazakhstan. Able to  facilitate the purchase and supply of petroleum product and fertilizer to any world safe port. without worry of sanction for Russia origin. 
   If you or any capable colleague has interest in purchase of any product.
Kindly revert back
 
--
Evgeny Alexandrovich Arkusha
Отправлено из Почты Mail.ru

Sabtu, Mac 25, 2023

Please update a link from your website - Julia from Dropbox Sign

Hi,

We're delighted to announce that we have rebranded from HelloSign to Dropbox Sign!

Along with this name change, all of the HelloSign products are changing too: HelloSign is now Dropbox Sign, HelloSign API is now Dropbox Sign API, HelloWorks is now Dropbox Forms, and HelloFax is now Dropbox Fax.

We noticed that a page on your website still refers to our old branding, and we were hoping you'd be able to update it so your visitors don't get confused.


If you could so kindly update the page with the following:



Additionally, please also consider replacing any mentions of "HelloSign" to "Dropbox Sign" within the content, including any headings and the page title.

If you are unable to update these changes, would you please forward this email to a member of your team who will be able to assist us?

Thank you for your help with this matter.

Kind Regards,

Julia Strudwick

Marketing Consultant

Dropbox Sign

Selasa, Mac 07, 2023

Dear jkkbatuban.iszu

Hello jkkbatuban.iszu My company has something important to share with you