M
Max
Коллеги, всем день добрый!
Возникла задача - получить все IP адреса сервера Domino агентом.
Можно ли это сделать?
Возникла задача - получить все IP адреса сервера Domino агентом.
Можно ли это сделать?
Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе
можно.
Есть несколько методов. зависит от контекста
По разному. Есть проверка открытия основной БД для работы пользователей, есть запрос в консоль "удаленного" сервера (получаю диски, CPU, RAM). Получаю также список programs из АК.каким образом "стучится"?
import java.net.InetAddress;
import java.net.UnknownHostException;
public class GetIP {
public static void main(String[] args) {
InetAddress address = null;
try {
address = InetAddress.getByName("www.java2s.com");
} catch (UnknownHostException e) {
System.exit(2);
}
System.out.println(address.getHostName() + "="
+ address.getHostAddress());
System.exit(0);
}
}
самый простой способ - подключить JAVA при условии, что известен хост.
Хост можно найти в names.nsf
не надо так делать!Может все-таки LS или win API как-то использовать?
package kodiForm;
import org.apache.commons.net.util.SubnetUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.*;
import java.util.*;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static java.lang.System.out;
/**
* Created by mike on 29.10.15.
*/
class NetUtils {
private static int TIMEOUT = 500;
private static short MASQ_LIIM = 20;//limit prefix masq len for restrict lage network scan
private static final String resPath = "./res";
private static final Logger LOG = LoggerFactory.getLogger(new Throwable().getStackTrace()[0].getClassName());
private static Predicate<NetworkInterface> notLoopback = iface -> {
boolean ret = false;
try {
ret = !iface.isLoopback();
} catch (SocketException e) {
e.printStackTrace();
}
return ret;
};
private static final Predicate<NetworkInterface> notFake = iface -> {
boolean ret = false;
try {
ret = !iface.isLoopback() & !iface.isPointToPoint()
& (Collections.list(iface.getInetAddresses()).size() > 0)
& !iface.isVirtual();
} catch (SocketException e) {
e.printStackTrace();
}
return ret;
};
private static final Predicate<InterfaceAddress> masq = addr -> {
boolean ret = false;
ret = addr.getNetworkPrefixLength() >= MASQ_LIIM;
return ret;
};
private static final Predicate<InterfaceAddress> ipv4 = addr -> {
LOG.info("filter IPV4 for:" + addr.getAddress().getHostAddress());
return addr.getAddress() instanceof Inet4Address;
};
//http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/util/SubnetUtils.html
//http://stackoverflow.com/questions/2942299/converting-cidr-address-to-subnet-mask-and-network-address
/**
* @param address tested address
* @param subnet CIDR notation "192.168.0.1/16"
* @return true if included
*/
private static boolean checkIpBySubNet(String address, String subnet) {
SubnetUtils utils = new SubnetUtils(subnet);
LOG.info("Network:{}", utils.getInfo().getNetworkAddress());
return utils.getInfo().isInRange(address);
}
/**
* @param address tested address
* @param subnetaddr address from subnet (any known)
* @param mask mask
* @return true if included
*/
public static boolean checkIpBySubNet(String address, String subnetaddr, String mask) {
SubnetUtils utils = new SubnetUtils(subnetaddr, mask);
return utils.getInfo().isInRange(address);
}
/**
* @param anyIp
* @return list local interface addresses accessible for anyIp (within subnet)
* @throws SocketException
*/
public static List<String> accessibleAddresses(String anyIp) throws SocketException {
return getIfacesList().stream()
.filter(iface -> {
String cidr = String.format("%s/%s", iface.getAddress().getHostAddress()
, String.valueOf(iface.getNetworkPrefixLength()));
return checkIpBySubNet(anyIp, cidr);
})
.map(iface -> iface.getAddress().getHostAddress())
.collect(Collectors.toList());
}
public static List<String> accessibleRange(String anyIp) {
ArrayList<String> res = new ArrayList<>();
InetAddress[] addrs = null;
try {
addrs = InetAddress.getAllByName(anyIp);
} catch (UnknownHostException e) {
e.printStackTrace();
}
assert addrs != null;
for (InetAddress addr : addrs) {
try {
if (addr.isReachable(1000)) {
res.add(addr.getHostAddress());
}
} catch (IOException e) {
e.printStackTrace();
}
}
return res;
}
public static List<String> accessibleRange() {
ArrayList<String> res = new ArrayList<>();
for (String saddr : getRangeFromLocal(0)) {
InetAddress addr = null;
try {
addr = InetAddress.getByName(saddr);
if (addr.isReachable(TIMEOUT)) {
res.add(addr.getHostAddress());
} else {
System.out.println("Is Not reachiable: " + addr.getHostAddress());
}
} catch (IOException e) {
e.printStackTrace();
}
}
return res;
}
@SafeVarargs
private static <T> T[] concatAll(T[] first, T[]... rest) {
//http://stackoverflow.com/questions/80476/how-can-i-concatenate-two-arrays-in-java
int totalLength = first.length;
for (T[] array : rest) {
totalLength += array.length;
}
T[] result = Arrays.copyOf(first, totalLength);
int offset = first.length;
for (T[] array : rest) {
System.arraycopy(array, 0, result, offset, array.length);
offset += array.length;
}
return result;
}
private static List<NetworkInterface> getIfaces() throws SocketException {
return Collections.list(NetworkInterface.getNetworkInterfaces()).stream().filter(notFake).collect(Collectors.toList());
}
public static String[] getRangeFromLocal(int ifNum) {
String[] res = {};
NetworkInterface liface;
try {
if (ifNum >= 0) {
//liface = Collections.pinglist(NetworkInterface.getNetworkInterfaces()).get(ifNum);
//liface=NetworkInterface.getByIndex(ifNum); // by real num in interfaces pinglist
liface = getIfaces().get(ifNum);
//displayInterfaceInformation(liface);
//res=new String[]{liface.getInterfaceAddresses().get(0).getAddress().getHostAddress()};
//filter only IPV4
res = liface.getInterfaceAddresses().stream()
.filter(ipv4)
.filter(masq)
.map(a -> new SubnetUtils(a.getAddress().getHostAddress() + "/" + String.valueOf(a.getNetworkPrefixLength())).getInfo().getAllAddresses())
.reduce(new String[]{}, NetUtils::concatAll);
/*for(InterfaceAddress addr:liface.getInterfaceAddresses()){
LOG.info(addr.getAddress().getHostAddress() + "/" +addr.getNetworkPrefixLength());
res = concatAll(res,new SubnetUtils(addr.getAddress().getHostAddress() + "/" + String.valueOf(addr.getNetworkPrefixLength())).getInfo().getAllAddresses());
}*/
// res = new SubnetUtils(liface.getInterfaceAddresses().get(0).getAddress().getHostAddress() + "/" + String.valueOf(liface.getInterfaceAddresses().get(0).getNetworkPrefixLength())).getInfo().getAllAddresses();
} else {
res = Collections.list(NetworkInterface.getNetworkInterfaces()).stream()
// networkInterface.getInterfaceAddresses().stream()
.filter(notFake)
//for each interface (excluding localhost, virtual, P2P)
//return String[]
.map(iface -> {
return iface.getInterfaceAddresses().stream()
.filter(ipv4)
.filter(masq)
//for each ipv4 address on interface
.map(a -> new SubnetUtils(a.getAddress().getHostAddress() + "/" + String.valueOf(a.getNetworkPrefixLength())).getInfo().getAllAddresses())
.reduce(new String[]{}, NetUtils::concatAll);
// return new SubnetUtils(iface.getInterfaceAddresses().get(0).getAddress().getHostAddress() +
// "/" + String.valueOf(iface.getInterfaceAddresses().get(0).getNetworkPrefixLength())).getInfo().getAllAddresses();
})
//return combined String[] (for all interfaces)
.reduce(new String[]{}, NetUtils::concatAll);
}
} catch (SocketException e) {
e.printStackTrace();
}
return res;
}
private static void displayInterfaceInformation(NetworkInterface netint) {
//https://docs.oracle.com/javase/tutorial/networking/nifs/listing.html
out.printf("Display name: %s\n", netint.getDisplayName());
out.printf("Name: %s\n", netint.getName());
out.printf("Index: %s\n", netint.getIndex());
Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
for (InetAddress inetAddress : Collections.list(inetAddresses)) {
out.printf("InetAddress: %s\n", inetAddress);
}
out.printf("\n");
}
private static List<InterfaceAddress> getIfacesList() throws SocketException {
return Collections.list(NetworkInterface.getNetworkInterfaces()).stream()
// networkInterface.getInterfaceAddresses().stream()
.filter(notFake)
//for each interface (excluding localhost, virtual, P2P)
//return String[]
.flatMap(iface -> iface.getInterfaceAddresses().stream()
.filter(ipv4)
.filter(masq))
.collect(Collectors.toList())
;
}
public static void main(String args[]) throws SocketException {
//createFtpUser("test","fortestonly");
//startFtp("1680");
//accessibleRange().forEach(addr->System.out.println(addr));
Enumeration<NetworkInterface> nets = null;
try {
nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections.list(nets))
if (!netint.isLoopback() & !netint.isPointToPoint()
& (Collections.list(netint.getInetAddresses()).size() > 0)
& !netint.isVirtual()) displayInterfaceInformation(netint);
} catch (SocketException e) {
e.printStackTrace();
}
if (args.length < 1) {
System.err.println("Usage: java Ping ifaceNum");
return;
}
int firstArg = -1;
if (Pattern.matches("[0-9]+", args[0])) {
firstArg = Integer.parseInt(args[0]);
}
//firstArg=-1;
out.printf("Param: %d\n", firstArg);
out.println(Arrays.toString(getRangeFromLocal(firstArg)));
//return 0;
}
}
в серверном документе не обязательно будет IPпроще брать ip из документа сервера. Если такой путь не подходит, то сделать справочник соответствия названия сервера и ip-адреса. При этом не прийдется дополнительно нагружать сервера различными расчетами
win API ... а если сервер не виндовый?
Ну можно еще извратиться через CGI...
совсем забыл..., если сервер привязан к IP (а лучше- чтобы оно так и было), то - команда nslookup <server name>
[DOUBLEPOST=1457087435,1457087377][/DOUBLEPOST]остается не раскрытой тема самой необходимости знать серверный IP
издеваетесь?nslookup - не понятно как ее подать скриптом или в консоль Domino. и как получить ответ.
ну поменяли и что? на что это повлияет?А IP мне нужно знать актуальное - т.к. у нас иногда (редко конечно - но уже пару раз натыкались) наши доблестные инфраструктурщики меняли IP-шники серваков.
издеваетесь?
nslookup системная команда, ну вот и запускать её нужно в системе Shell
LS это вполне сможет, получить резалт - можно в файл (и его распарсить)
lmike сказал(а):ну поменяли и что? на что это повлияет?
вот тогда еще больше вопросов о неприятии javaЯ только только начинаю кодить в LS. Всего естественно не знаю.
По-моему, правильнее было бы в этих базах "порядок навести". У нас тоже часто IP меняется у разных систем, то новую железку поднимут, то проапгрейдят чего-нибудь. Раньше тоже такие базы были, где IP-адреса в код зашиты - постоянно "ломались".Долго объяснять. В двух словах - Некоторый набор прикладных БД - взаимодействует используя именно IP....спасибо за идеи и "направления" куда копать.
Dim IP As String
Dim User As String
Dim Password As String
'тут определяем данные для пользователя подключения....
If (IP<>"") And (User<>"") And (Password<>"") Then 'Учетки для подключения к windows машине
Print "Подключение к серверу "+IP
Dim WBEM As New ClassWBEM '(это не родной класс Lotus, а просто мини-класс для удобства инициализации wbem-запросов - буквально несколько строк можно посмотреть в интернет как wbem - запросы формируются в LotusScript)
If wbem.ConnectToServer(IP, "", User, Password) Then
Dim Results As Variant 'массив с адресами удаленного сервера
'В запросе получаем не только все адреса но и только действующие
Set Results = wbem.query("Select IPAddress from Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'")
If Results Is Nothing Then
Print "Не удалось получить данные"
Else
ForAll objItem In Results 'перебираем полученные адреса
If FullTrim(objItem.Description)={} Then
Else
'Собственно очередной IP-адрес с удаленного сервера
Print FullTrim(objItem.Description)
End If
End ForAll
End If
End If
End If
Обучение наступательной кибербезопасности в игровой форме. Начать игру!