People often ask me "How did you learn how to hack?" The answer: by reading. This page is a collection of the blog posts and other articles that I have accumulated over the years of my journey. Enjoy!
Log4J library in Java. By simply adding a special format string to the logging output, the Java Naming and Directory Interface (JNDI) queries. This interface is quite powerful and can lead to remote code execution when it reaches out for a remote Java class to execute. JDNI injection is a bug class in itself that has been seen before. javax.naming.Context.lookup. They found a very similar bug: several code paths path unfiltered attacker-controlled URLs to the javax.naming.Context.lookup function. Driver Class and JDBC URL. By specifying a malicious class to be loaded pre-auth code execution (almost by design) within the application. By default, only default connections for this are allowed and the console should run only on localhost. LINK_SCHEMA stored procedure passes driver and URL arguments directly into a vulnerable function. By setting this up properly, code execution can be achieved. However, this does require the ability to execute arbitrary queries on the database, which makes this unlikely to occur. remote JNDI queries. It should only allow for local calls. To me, this seems feeble but we will see if it stands the test of time. #! but without the interpreter, MacOS will gladly run this. But, for some reason, the missing interpreter bypasses the verification that MacOS should do with the user protections mentioned above. Why does this happen? #! only) then an error message is returned when trying to call exec_shell_imgact. If this fails as a script, it will now use /bin/sh as the program to run. /bin/sh. Since this is a now a MacOS binary instead of a bash script, the call to exec_shell_imgact never happens. Eventually, when this gets to policy manager at syspolicyd, it decides that no security checks need to be made because it is NOT a script and is a trusted platform binary. 0.0.0.0, which is available publicly. After viewing what the commands were actually doing, the author noticed the word WebSocket on port 63574. From reading the scripts for booting the Web Socket server, there was no IP address being specified! To them, this indicated that this was likely done on accident. localhost. The server did not care about the Origin of the request during the initial testing. Node Inspector instance can be created. Since this is listening on all interfaces, all a victim has to do is visit our personal website to trigger the bug. Once, the outside application or local website connects to the server, arbitrary code can be ran on the machine. Another option is emulating the VS code client directly, but this would require a ton of reverse engineering to figure out.0.0.0.0 and checking the Origin of the Web Socket upgrade request. The actual fix was to verify the connection token in the request, which was not being done properly before. execArgv variable as well to no avail because of typescript. The URI handler was looked at to no avail as well. I appreciate the thought process for this added, even if it did not work. 0.0.0.0, which is available publicly. After viewing what the commands were actually doing, the author noticed the word WebSocket on port 63574. From reading the scripts for booting the Web Socket server, there was no IP address being specified! To them, this indicated that this was likely done on accident. localhost. The server did not care about the Origin of the request during the initial testing. Node Inspector instance can be created. Since this is listening on all interfaces, all a victim has to do is visit our personal website to trigger the bug. Once, the outside application or local website connects to the server, arbitrary code can be ran on the machine. Another option is emulating the VS code client directly, but this would require a ton of reverse engineering to figure out.0.0.0.0 and checking the Origin of the Web Socket upgrade request. The actual fix was to verify the connection token in the request, which was not being done properly before. execArgv variable as well to no avail because of typescript. The URI handler was looked at to no avail as well. I appreciate the thought process for this added, even if it did not work. chroot jail SSH shell. The applications can either contain native code or be HTML/JS based. Snapshot Blobs. Snapshot blobs allow a previously created V8 context to be dynamically loaded to save time. So, what if we modified this upon application load? addrof() and fakeobj primitives then uses this to execute their own shellcode. To me, the interesting part was the finding of the bug in the first place. /dev/mem is world writable! This gives us direct access to the physical address space, which is the keys to the castle. struct cred in RAM. Once they found it, they elevated its creds to root by writing to /dev/mem directly. Another trick they had to use was to find the addresses in physical memory that we wanted by accessing the contents of iomem_resource. Using this, they could find the proper task information to access, eventually modifying the task associated with our process. SafeDisc signature is within setup.exe, which boots the game. So, the author had an idea: "If SafeDisc is used on the installer, why don't we just install it ourselves?" The program is not installed correctly. Please run the installer again.
This required some digging. Procmon. Procmon logs all of the WinApi calls for the attached to application. After clicking through the tool for a while, they noticed a registry key access to HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MulleHus.exe. If this was not found, then the application would crash since it thought that the game was not properly installed. Procmon tool as well. STATUS and MEASUREMENT_CONTROL_DATA. From further reverse engineering, they found the data in each of the packets. The MEASUREMENT_CONTROL_DATA packet had line information, test ID, checksum, crc and many other values. STATUS packet had the status of the test (positive or negative), measurement count and some other information. This was found by looking at the classes in the decompiled Android application. urlparse in Python. urlparse module treats semicolons as a separator. However, most modern proxies only treat ampersands as separators. Practically, an attacker could separate query parameters using a semicolon (;) where one server would see multiple query parameters while the other would see one less. ?link=http://google.com&utm_content=1;link='>alert(1) HTTP/1.1 would see 3 query parameters: link, utm_content and link. However, modern proxies would only see link and utm_content. Neat! Cache desyncing!t-l (t users necessary to use the secret) over a finite group. The shares are created by evaluating the polynomial at n (amount of users) at different points with one for each user. The key is that a single point does not reveal any information about the polynomial.