LongCut logo

I Hacked This Temu Router. What I Found Should Be Illegal.

By Low Level

Summary

Topics Covered

  • Command Injection Bricks $5 Bestseller
  • Accidental Reset Exposes Firmware Download
  • Decompile Webserver to Uncover Time Config RCE
  • Exploit CGI Upload for Root Shell

Full Transcript

One of my favorite things to do is to buy weird devices and see if I can find vulnerabilities in them. You know,

typically embedded devices tend to have the worst security. So, it's kind of a fun exercise in bug hunting. Now, what I want to show you today is the story of how I found several egregious vulnerabilities. And this device here on

vulnerabilities. And this device here on Teimu, you know, it's kind of fun. Go on

T-Mo, you buy a $5 device and you see what you can do. Now, I want to highlight here uh that this not only was $30 and now it's only $5. There's 84%

savings, but also it is the number one bestselling item on Teimu in Wi-Fi and networking with over a 100,000 sold. So,

from a general security of the world perspective, not a great place to be. In

this video, we're going to go into how I took the device apart, opened the firmware, and found some pretty egregious issues. And watch as my hair

egregious issues. And watch as my hair grows and I change my shirt. So, when

you plug in this device and you navigate to the IP address for that thing, you'll see this interface. Now, a bad habit that I typically have when I audit a new uh weird embedded device is I typically

try to put this little oneliner in here.

And you'll see why this is bad. So, what

I'm attempting here is my assumption is that it's a piece of trash embedded device and they're just passing this Wi-Fi password parameter to a system call and they're not sanitizing the

input. A way that I can quickly validate

input. A way that I can quickly validate that without pulling any of the firmware out of the device is by doing a reboot command injection by putting the dollar sign in these two brackets. It's a

command injection, which means that it'll run an arbitrary system command if it's vulnerable. And the system command

it's vulnerable. And the system command that I want to run is reboot. Now, what

you'll see here is I go to restart the device, which is intentional, right?

I've set the properties of the device.

Uh, but we'll see here after a couple refreshes that uh it does not come back to life. What this means is I have

to life. What this means is I have rebooted the device in NVRAM. I put the password of the device in NV RAM and then every time it tries to come back

up, it's pulling that password out from NV RAM and triggering a vulnerability, rebooting it. I have now soft bricked

rebooting it. I have now soft bricked the device. But what's good about this

the device. But what's good about this actually led me to the next piece of the puzzle, which helped me get the firmware out of the device on accident. Now, when

I typically do this to a device, what I like to do is go to the device and hold the reset button. If you hold it for long enough, what that typically does is it tells the device, "Hey, I want to reset to factory settings, and that will

typically erase the malicious and VRAM that I put in there, and it should undo the soft brick that I did." When I was doing this myself, I held the reset button for 60 seconds, and this popped up. Now, you will notice that the IP

up. Now, you will notice that the IP address here changed. I had to kind of fight with it to get it to respond to me. I had to look in Wireshark to see if

me. I had to look in Wireshark to see if I was going to get any like random broadcast from a new IP address. But

eventually I got to this breed web interface that showed a fairly low-level diagnostic of the board. It looks like the build date and like the git commit of the server or the software as well as

the CPU and like the firmware on the thing. But if you do a quick little uh

thing. But if you do a quick little uh Chinese to English uh translation here, the one thing that caught my eye as a vulnerability researcher is firmware backup. Now to me, this meant one of two

backup. Now to me, this meant one of two things. Either I was able to upload new

things. Either I was able to upload new firmware, which is good, or I was able to download the firmware, which is even better. And luckily, if I press the

better. And luckily, if I press the programmer firmware button, I can download the entire system full.bin.

You'll see I've done this other times for previous takes of the video. Uh, but

I'm able to download the firmware for the device, which is great. A lot of the times that you have to do is like desolder a chip off the board, for example, like maybe like a a flash chip like one of these, and then put it into

a flash reader. Maybe there's some weird like locking going on. The ability to just download the firmware automatically like this is super cool. So, what we can actually do now is go into our downloads

here. Let's go to downloads and we can

here. Let's go to downloads and we can do a little bin. Binwalk uh recursive extraction of full 2.bin.

And what we should get at a certain level is the file system for the device.

Typically, these things contain file system. So, if I go into extractions

system. So, if I go into extractions here and I go to the SquashFest route, I now have the entire file system for the device. This is great. Now, after

the device. This is great. Now, after

resetting the device, getting it back to its normal configuration, doing a factory reset, I'm back into the device.

So, now the question is like, where do we go from here? We have the firmware over here on this tab, and I have like the web interface on this tab. What when

we're doing research on this thing, what do we do? Well, what I'm interested in is vulnerabilities that arise from a user sending data to a server somewhere and there being a vulnerability in that server. The server we have access to

server. The server we have access to right now is the web server. So, let's

see if we can identify maybe some methods that we can use to trace in the firmware where this data is processed.

Typically, I like to go to the network tab and when I reload a page, I see like are there any strings that pop out as something that may be uh custom or something that may be interesting. The

first thing you may see very obviously pretty quickly is this post request to this protocol.csp

this protocol.csp fname equals net option equals wizard config. There's a bunch of it looks like

config. There's a bunch of it looks like custom stuff going to this protocol.csp

function. So what I'm going to do now is go into the root directory and just grap around for protocol.csp. Maybe there's a binary name to this. And pretty quickly we see that we have an etsy

lightyroxy.com and we could see what's going on in here. So, what this means is that every

here. So, what this means is that every request that goes to this protocol that CSP, we go to an internal port 81.

Interesting. That's not super interesting, though, because I don't really know right now what binary binds to port 81. So, let's see if there are any other strings near that are interesting. What about wizard comp?

interesting. What about wizard comp?

Let's see if we can copy that value and do the same kind of thing. Again, we're

literally just doing searches for strings because the strings, we see them in the request, so they kind of have to exist on the system. And pretty quickly, we see they exist in two places. one the

router.js JS which gets served to us and we use it to talk to the device. But

more importantly this user espin commuos little little communism reference in there kind of interesting. Uh so what we can do now is use this comm binary. We

can put it into a decompilation and analysis framework and maybe find some weird vulnerabilities. Let's go try that

weird vulnerabilities. Let's go try that out right now. And what I've done is I've opened this com binary. The binary

literally hosts the web server on our device. I put it into gedra. GEDra is a

device. I put it into gedra. GEDra is a reverse engineering and decompilation and disassembly framework. So we kind of have two main columns here if you're new to this world. Basically here in the

middle we have the assembly, the machine code that is being run on the device when this binary operates. And then on the right we have the decompilation. The

decompilation is Gedra's best guess at what the C code looked like for the device. I'm zoom in a little bit here to

device. I'm zoom in a little bit here to see if I can make it bigger for you guys. And so what we have to do now is

guys. And so what we have to do now is figure out, okay, where do these parameters that are getting put into the program get parsed? How do we know what they do? And can we find maybe either

they do? And can we find maybe either other hidden features like back doors or vulnerabilities in this program that we can exploit for this device? So we can do now is go to the defined strings.

Let's just search for this wizard string, right? And we can see pretty

string, right? And we can see pretty quickly Gedra has found the wizard config string right here. Now you'll

notice there is a cross reference to this and it exists inside of what looks like a table. This is a table because there is a series of pointers to strings and then after the pointer to string

there is a pointer to a function. Now it

may be the case that this is just a lookup table. If I go to the wizard

lookup table. If I go to the wizard string config right there, this wizard config string, I'm going to run this function. What we can do to kind of

function. What we can do to kind of validate this assumption is go into Gedra's decompilation of it and then maybe read what it does. we can read some of the strings inside of this. We

have some function on this work mode string, some function on this WAN mode string, and then compare this to reality, right? If we compare this to

reality, right? If we compare this to the other, you know, like pieces of data in this request, maybe we can see if this is like what's actually going on.

So, as I was going through all of the available options we have, all the available commands that we have here, this one caught my eye. So, you see this is time config, right? This is likely what we can use to configure the time of

the device. But if you go into here and

the device. But if you go into here and start to read some of the code, you may uh if you have any experience in this world, uh immediately see a variety of issues. So first of all, we have this

issues. So first of all, we have this statically defined user buffer. I'm

going to call this uh time buff for a reason you'll see here in a second. We

take some data that likely comes out of the time variable. You'll see we have the time string here. We have to set this data to be a string for it to resolve properly. Right? we have some

resolve properly. Right? we have some function of time from param 2 which is going to be likely our request. So if

this is the function that we use, if this is us pulling all these little extra pieces out of this request, right?

We have function equals get math all of these parameters in the URL. If that is how we assume that this is being ran, we can assume that this is pulling the time parameter out of the URL. And this makes sense, right? Because the time parameter

sense, right? Because the time parameter is likely what we're going to need to configure the time. This is the time comp function. So I'm going to name this

comp function. So I'm going to name this time comp. And I'm going to call this

time comp. And I'm going to call this little function here uh get param.

Right? So we have get param from the request s sprintf that into the time buffer date s. So we're going to set the date to our little input and then do

system command on that time buffer. Now

this is a wrapper for system. So what we could assume is that this is going to properly sanitize the input. But like

any good hacker, we're going to uh we're going to test that assumption. Right? So

what we can do to test this is literally just write the command ourselves. So

curl 192.16811.1 protocol.csp

protocol.csp it was um fname equals net from that first request here and we want to do and opt equals time comp and the time is

equal to let's just do garbage for right now and there was some random math variable that maybe like their bad attempt at a CSRF or like a seed. So

we're just going to steal that for right now. And then the function is equal to

now. And then the function is equal to it was get, right? I did some more reading and there's actually it does a compare on get or set and it's going to return that. And we have to actually be

return that. And we have to actually be doing a set operation to get into this function. Right? So what we can do is do

function. Right? So what we can do is do set for this. I'm going to wrap this in a single quote because I want to do a command injection at some point and I don't want to command inject myself. And

you'll see that it says set error equal to zero which means that we set them the the date equal to asf asf. What we can do now is actually test does our command injection work? Do we have the ability

injection work? Do we have the ability to run arbitrary commands through just the use of a simple reboot? And you'll

see first it says error zero and the second time the command hangs because the device has rebooted. Right? We have

turned the device on and off and now we can no longer connect to the device. So

we can run arbitrary commands on this device. But but that's not cool. That's

device. But but that's not cool. That's

not cool enough. We want to get a shell on this device. I want to have access to this device via the command line. So

what can we do? So going back to our um our firmware image here, we can see all of the binaries that are on the device.

And you'll see pretty quickly that we have the lovely tnetd. So user espin tn netd is a binary that we can use to basically run any other binary on any

other port, right? Assuming there are no firewall rules in place. And so what we can do to uh mess with that guy is first of all I got to reset my network interface. And then now we can update

interface. And then now we can update our our exploit to actually set up the right thing. So what I want to do is

right thing. So what I want to do is user sbin tn netd. So first of all we're putting this IFS separator to to emulate a space on the device cuz sometimes uh

in HTTP the spaces will get escaped weirdly. We want to do -ps on port 444.

weirdly. We want to do -ps on port 444.

And then we want to set the um the login binary to be uh bin ash I believe is the the shell that we have. So now if I do netcat 192168

uh 1114444 I don't have a shell. Okay, let's try again. Hold on. Before we do that

again. Hold on. Before we do that though, I want to get a little more insight into what's actually going on in the device. Like what is what is the

the device. Like what is what is the process list? What does the environment

process list? What does the environment look like? Luckily, we have command

look like? Luckily, we have command execution on the device and we can run those commands. There's just nowhere to

those commands. There's just nowhere to really put that data. Well, sort of. If

we actually go to the uh the file system here, we're going to go to the config file for Etsy lighty and we're going to cat the lighty config. You'll see that

we're actually serving data from the webs directory for this device. Well,

there actually there are two instances running of this. But you'll see that we have one of them is a writable folder that's called /webs. Let's see if I can find it here. Do this and then grab webs. So server document route for this

webs. So server document route for this instance of lighty is called /webs. What

we can actually do now is run this cute little thing where we do ps and we just take the process list and write it to web/he hehe and because that's the document route for our server now we can

just curl he he and bada bing bada boom we get the process list so we can see a bunch of stuff going on we can see that we have the lighty running with that instance of the config that gives us

access to the webs folder we have a drop bear server we have tnet running what I want to run though is my own version of the tnet server. I want to get in there and I want to, you know, run my Tnet

server to give me a shell on device.

Now, after a while, I was messing with this curl command that uses the command injection to run TNETD. And with TNETD, you can specify a port number and a login program to use in place of bin

login. And if you can just set binsh,

login. And if you can just set binsh, you can use that as basically a bind shell. Now, the problem is I had a

shell. Now, the problem is I had a couple issues where it would run, but it didn't actually run the command. And I

think something is either wrong with TNETD where it doesn't allow for IFS or there's some issue with this. But what I did find after a little bit of searching is a nice little program on the device

that's called /webs/cgibin/upload.cgi,

which is what you're using to actually upload a temporary piece of firmware before you do a firmware update on the device. The reason I know this is by

device. The reason I know this is by doing a simple strings on the device or on the upload.ci, CGI. You'll see that it writes the file out to temp temp firmware. And so you can actually use uh

firmware. And so you can actually use uh curl to do a file upload using the exact process they use this multi-art form data by doing file equals at and then the name of the file. Right? So you can

literally do that and point it to that URL. And in doing that you will get

URL. And in doing that you will get upload.cgi to ingest the script and put

upload.cgi to ingest the script and put it on temp firmware. And what you can actually see here is if we do a uh ls of

um of temp and we get hehei, you will see that this temp firmware file actually exists now. It's now on the device, which is crazy. So now all we have to do is do a little bit of a a

commod plus x to make the file executable. We will commod plus exit and

executable. We will commod plus exit and we'll do just the temp firmware run.

We're going to run the temp firmware file which has a script. Oh, I didn't show you the script. Uh yeah, the script that I wrote uh by the way is uh scripts.sh, which literally just enables

scripts.sh, which literally just enables a telnet D server as I want it to run, right? So it runs a script as bin ash

right? So it runs a script as bin ash and it runs user spin tnet d b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b bin aash port 4444. And you can see this all works

4444. And you can see this all works together. If we simply just go here and

together. If we simply just go here and do a little netcat 192.16811 4444, bada bing, bada boom, we're root, baby. This

is VR, guys. This is the world of acquiring weird little devices off of Teimu, taking them apart and seeing what issues we can find. Let's talk

responsible disclosure, right? I have

tried very hard to identify what company makes this device. I cannot ID one. So,

this is a bug that I could not find anyone to tell about. So, now I'm telling you guys. Okay, awesome. All

right, guys. If you enjoyed this, do me a favor. Go check out Stack Smash. It's

a favor. Go check out Stack Smash. It's

my community where I teach people how to do stuff like this to not only figure out how to hack, how to make the world a safer place, but software security. And

if you like this channel, then hit hit that sub button over there. It's right

it's down there somewhere. Uh we'll see you in the next one. Take care. Goodbye.

Loading...

Loading video analysis...