Skip to content

Instantly share code, notes, and snippets.

@gubed
Last active June 10, 2016 21:46
Show Gist options
  • Save gubed/6dccfa408b8ce85fe279f4aa85fd6952 to your computer and use it in GitHub Desktop.
Save gubed/6dccfa408b8ce85fe279f4aa85fd6952 to your computer and use it in GitHub Desktop.
''' <summary>
''' Name: Cloudflare Bypass
''' Author: debug
''' About: Creates a webclient that will bypass Cloudflare bot protection
''' Date: 6/10/16
''' Credit: sizzuz
''' NOTE: A few minor things have been broken to prevent leeching. Thanks
''' </summary>
Class CloudflareBypass
Private Shared _UserAgent As String
Private Shared Function RandomUserAgent() As String
'Consider using stronger random class...
Dim r As New Random(CInt(DateTime.Now.Ticks))
Dim uA As String() = {"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.85 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0",
"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
"Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.01",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"}
Return uA(-1)
End Function
Public Shared Function CFClient(domain As String) As WebClient
Dim cc As New CookieContainer()
Dim req As HttpWebRequest = DirectCast(WebRequest.Create(domain), HttpWebRequest)
req.CookieContainer = cc
_UserAgent = RandomUserAgent()
req.UserAgent = _UserAgent
Try
req.GetResponse()
Return New WebClient()
Catch ex As WebException
' CF should returns 503 error
If ex.Response IsNot Nothing Then
Dim response = TryCast(ex.Response, HttpWebResponse)
If response IsNot Nothing Then
If response.StatusCode <> HttpStatusCode.ServiceUnavailable Then
Return New WebClient()
End If
' Other error
End If
End If
' Get CF cookie
Dim cfduid = GetCookie(cc, domain, "_cfduid")
If String.IsNullOrEmpty(cfduid) Then
Return Nothing
End If
Dim shit As HttpWebResponse = DirectCast(ex.Response, HttpWebResponse)
' Get the bypass url, and amount of time to sleep
Dim reg As Match = Regex.Match(shit.Headers("Refresh"), "(.*?);URL\=(.*?)$")
Dim refreshBit = reg.Groups(2).Value
Dim refreshTime = Integer.Parse(reg.Groups(1).Value)
' Wait the refresh time
Thread.Sleep(refreshTime * 1000 + 100)
' Pad with 100ms just in case
' Get clearance
Try
req = DirectCast(WebRequest.Create(domain & Convert.ToString(refreshBit)), HttpWebRequest)
req.CookieContainer = cc
req.UserAgent = _UserAgent
' Test clearance
Dim r As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse)
If String.IsNullOrEmpty(GetCookie(cc, domain, "cf_clearence")) Then
Return Nothing
End If
' Create new webclient with our cf_clearance cookies
Dim client = New WebClientEx(cc)
client.Headers.Add("UserAgent", _UserAgent)
client.Headers.Add("Referer", domain)
Return client
Catch generatedExceptionName As WebException
Return Nothing
End Try
End Try
End Function
Private Shared Function GetCookie(cc As CookieContainer, domain As String, cookie As String) As String
For Each c As Cookie In cc.GetCookies(New Uri(domain))
If c.Name = cookie Then
Return c.Value
End If
Next
Return Nothing
End Function
End Class
' Credit to someone on stackoverflow, sorry
Friend Class WebClientEx
Inherits WebClient
Public Sub New(container As CookieContainer)
Me.container = container
End Sub
Public Property CookieContainer() As CookieContainer
Get
Return container
End Get
Set
container = value
End Set
End Property
Private container As CookieContainer
Protected Overrides Function GetWebRequest(address As Uri) As WebRequest
Dim r As WebRequest = MyBase.GetWebRequest(address)
Dim request = TryCast(r, HttpWebRequest)
If request IsNot Nothing Then
request.CookieContainer = container
End If
Return r
End Function
Protected Overrides Function GetWebResponse(request As WebRequest, result As IAsyncResult) As WebResponse
Dim response As WebResponse = MyBase.GetWebResponse(request, result)
ReadCookies(response)
Return response
End Function
Protected Overrides Function GetWebResponse(request As WebRequest) As WebResponse
Dim response As WebResponse = MyBase.GetWebResponse(request)
ReadCookies(response)
Return response
End Function
Private Sub ReadCookies(r As WebResponse)
Dim response = TryCast(r, HttpWebResponse)
If response IsNot Nothing Then
Dim cookies As CookieCollection = response.Cookies
container.Add(cookies)
End If
End Sub
End Class
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment